The Morse Trainer (http://www.wolphi.com/ham-radio-apps/morse-trainer/morse-trainer-manual/) does exactly what you're looking for.
It provides random QSO, the first 20 lessons of the Koch method, and supports Farnsworth method, which I highly recommend because many of us consider it best to listen to the actual character speed at the rate we are attempting to acheive, while increasing the spacing between the letters so the brain can have time to adapt to receiving at slower rates.
This has the effect of you not having to relearn (i.e., train your brain to comprehend) the same characters over again when the delivery speed changes - it's not a problem to hear live code slower, just faster.
To surprise yourself, you can dump (paste) random pages from Wikipedia or any other textual source into the app, and even have it randomize that text. That way you have no idea what code you're going to copy.... and of course, the text is displayed, as you stipulated.
Moving forward, it should be noted that perfectly delivered code is NOT the real world - no one's "fist" is perfect code, so with respect to this phenomena I'll defer to the answer that @k7peh provided: Learn to listen to live code delivered by real people. Again, you'll need to let your brain be trained to copy this code accurately because any morse code tutor program is incapable of delivering this sort of imperfection.
Listening to w1aw is good, but an Android app that can tune into, say 20 meters, and offer you the opportunity to get a handle on different fists will go a long way toward getting you back to your morse tutor endeavoring to hear words, rather than characters, and then back to live radio again, where you'll eventually find yourself not even hearing/seeing the characters, but rather, the words themselves, eventually even anticipating the next word before it is sent.
One more thing, when switching back and forth between the tutor app for increasing your copying speed and accuracy, and live a live QSO, search in the novice and general portions of the particular band you choose, people there will generally be sending code at a slower rate - this will save you a lot of anguish from missed characters/words.
I hope this helps, and congratulations on your commitment to learning code!
73 de kd6ncg