Also, I really don't think we want to tie ourselves to the Lwt exception mechanism.  Async usually provides an explicit `cancellable` parameter instead.

I suggest not worrying about timeouts and cancellations in this API for now, and treating it (as the ring protocol does) as a request stream.  We can expose a lower-level (and correspondingly harder to use) `Direct_block` API at a later stage for backends that do support more sophisticated cancellation schemes.