Our thrift code performs an elaborate dance to convert a result/exception
reported in a future<> to the cob/exn_cob flow required by the thrift
library. However, if the exception if thrown before the first continuation,
no one will catch it will be leaked, eventually resulting in a crash.
Fix by replacing the complete() infrastructure, which took a future as a
parameter, with a with_cob() helper that instead takes a function to
execute. This allows it to catch both exceptions thrown directly and
exceptions reported via the future.
Fixes#133.