Fix error handling with the combination of @asynchronous and @gen.coroutine.

Also make self.finish() optional for coroutines since we can finish
if the future resolves successfully.