Deal with errors thrown in callbacks in the callback API

My chosen tactic is to translate errors thrown in callbacks to errors
on the channel. This differs from the promise API, which won't in
general kill a channel if the success continuation throws an
error. (Perhaps it should)

Errors thrown in consumers are dealt with in the same way as in the
promise API, since this is done in the underlying channel machinery.