Disconnect on OkHttpClient.cancel

Before this change, cancel would apply either before the request was made, or after the response was received.  This change allows it to apply to an in-flight request.

Here are the most important scenarios:

  * Canceled before any I/O. We send onFailure with `CancellationException`
  * Canceled before we call onResponse. We send onFailure with `CancellationException `
  * Canceled after we call onResponse. The stream may break with `IOException`