Issue 3647 async requests

@callahad - Yo dude, this is one step to "getting there"! Mind reviewing?

So, basically, xhr.js was a heap of global state. We know, we don't like global state. So, I made it a real true blue module with no global state. This allowed me to simplify a lot of things.

fixes #3647