Catch more exceptions in async client code

Some experimenting with the load generator and also a bug report from Martin indicated that there were cases where exceptions were getting thrown in async client handlers that were not caught, and could prevent us from ever firing either the success or failure callbacks for a client call. This diff tries to catch all of those cases, to guarantee we'll fire one of the callbacks.