Fix error handling & refactor to be fully asynchronous

Quite the rewrite, but refactors to eliminate the weird queueing system internally.
It was awkwardly dancing between the two. Implementation is much simpler when unified. They weren't conceptually separate, despite trying.