Failover broken when hard exceptions occured when using *Async  methods 

When IConnection throws a hard exception in any of the *Async methods before actual async work has been done the async routines in `Transport.cs` do not properly failover as they only failover properly for tasks in faulted state. 

In most cases the exception happens in a way that causes a faulted task to be returned (when reading responses asynchronously) but some of the exception happen earlier with DNS lookups (see #802) these are always synchronously and will throw a hard exception. 

This PR also fixes the case where a hard exception during pinging/sniffing using the Async methods could cause a connection not to failover. 

The synchronous versions all behave correctly during hard exceptions.