Don't mask server failures

Altering the server so it re-throws thrown errors from async methods so the server is aware of them and can clean up if necessary. Also refactored the code a bit to remove a large-ish branch and provide the client with the server's stack trace (may make that configurable in the future, but its great for debugging).

cc @squamos