Block-based request/response API

Rather than adding yet another sprintf'd notification for handling
response errors, I added a block-based API that can handle both
success and errors.

I'm also assuming that requests are invalidated when disconnected,
so I'm explicitly cancelling all requests when the websocket disconnects.
If meteor magically is able to respond after a disconnect, I'll remove
that part.