Improve exception handling for NiftyClient connections

- Translate all exceptions to TTransportException
- Catch any exceptions in the ChannelFutureListener to make sure we always set a value or exception on the ListenableFuture
- Catch failure of cancel() call in the ChannelFutureListener to make sure we *always* set a value or exception on the ListenableFuture