The problem, as I see it, is complexity.
Today programming seems to be something that one needs to teach to children, rather than one children can learn.
By the time I was 10, I had outgrown my BASIC interpreter, and had taught myself 6502 assembly and Pascal. I could do this because each of these three languages is small, self-contained, and complete technical manuals came with my computer.
(I don't think I'm bragging. I'm not even the best programmer in my family. And I can always point to far more gifted programmers, like L. Peter Deutsch, who wrote the PDP-1 Lisp 1.5 compiler when he was 12.)
We don't write programs any more -- we write "systems". They're big and complex, and even when we make the languages simpler (Python), they have a gazillion libraries, and need to communicate with a gazillion other programs (like operating systems and web browsers) to make anything useful happen.
Simply put, the reason kids can't teach themselves to program any more is because they have to deal with 50 years of complexity that we've dumped on them. If they only had to deal with C=64s and PDP-1s they'd be writing assembly code and Lisp compilers on their own, too. We wouldn't need snap-together-blocks and cartoon cats to try to make it artificially fun.
You asked about "variables, control flow, iteration", etc. These are not hard concepts for kids to get. But if you sit them down at, say, a quad-core Mac OS X or Vista workstation, they start by looking at a box with fancy 3d graphics and animation and a UI that isn't consistent -- it's all magic.
It's like if you're trying to teach kids how a car works, you don't start with a Lexus Hybrid. I'm sure it's a great car, but it's fantastically complex inside (I've worked on hybrids before). It has 2 completely different engine systems routed to the user interface of "press pedal, make car go faster" -- magic. Instead, you get an old crappy clunker with a manual transmission so they can learn the basics.
(This isn't just old-versus-new, and I'm not just a bitter old-timer. All my friends with C=64s and Apple-IIs ended up programming them, and my friends with Amigas and Macs didn't. Also, none of my friends with Lexuses work on their cars -- if you want your kid to know how to fix a car, I wouldn't buy a Lexus. They're just too nice, reliable, and magical.)
Thus, do the same for computers. I hear some suggestions to limit the scope like "Python and the web". I say, go even further. Get an Apple II and C=64, including all the technical manuals. Python and the web are still loaded with tons of legacy cruft.