Hey @mescortes I'm looking into this and it gets kind of ugly rather quickly...

* Should failure and cancel share one callback or two? Ie. should we have two methods `onFailure` and `onCancel` or one method `onFailure` that does double duty for I/O problems and manual cancels?
* What thread do the cancelation callbacks occur on? Our choices are either the thread that called cancel, or a background thread. If it's the thread that called cancel then we have a problem because the other callbacks (`onFailure` and `onSuccess`) always occur on background threads. If it's the background thread, then there could be a non-trivial delay between calling `cancel` and receiving the callback.

For now I'm leaning towards not supporting cancel callbacks at all and waiting until a real use case springs up. Unless you have one of those already!