Use `lazy.js` for streams; improve error handling

Lazy.js provides a nice interface to work off of for our
asynchronously-resolved data.

Error handling was also improved. I spent lots of time running the bot
and randomly killing the network card to trigger edge cases.