For learning the high level concepts of programming I think that languages like Clojure, Haskell, Python and Ruby are best. They allowed me to easily play around with complex libraries and technologies. This helped me learn about how to evaluate and integrate others code into my own, they also introduced me to many concepts that I don't think I would have studied had I not chosen to learn the language.
For learning the elegance of programming I honestly think Javascript is the best. Some might disagree, but because of Javascript's weirdness and inconsistencies when I came across a really elegant solution, it really made me rethink the process I use to program solutions. I also learned a lot about "elegant" programming from reading and learning about Haskell and J.
For learning about the lower level mechanics of programming, I think that the C/C++. The languages are less forgiving and it forced me to think about the repercussions of my sloppy code.
I'm curious to know what others think.
I also think that Processing gets learners interested in programming much more than other languages because they see how easy it is to make their ideas come to life. Granted it's the same idea as Scratch, but the transition from Processing to "more difficult" languages is much easier than from say Scratch to Python.
Thanks for the App Inventor recommendation, I'll have a look.
I have never programmed in Smalltalk before, but I found Java and Ruby taught me the most about OOP concepts, I might have to take a dive into Smalltalk now.