I actually think we should hold up on this change momentarily.

First of all, hub invocation callbacks never get cleared when `socket.send` fails. This isn't a regression, and it should be easy to fix. Nonetheless, I feel this should be fixed before accepting the PR.

Secondly, after discussing changing the .NET client with @davidfowl, we decided that is probably better to have the client throw synchronously when trying to send via the WebSocket transport during reconnects. Basically the idea being that if you *can* throw immediately, there is no reason to rely on the error callback.

It is cleaner to throw synchronously in C# where you have async/await so you only need a single try-catch to handle both sync and async exceptions.

Perhaps fixing the callback issue will be enough for the JS client, since the `fail` handler will then be triggered when invoking hub methods. However, fixing the callback issue won't fix persistent connections, so I would prefer going back throwing synchronously in the JS client as well.

@davidfowl thoughts?