Add a util::Task class to manage async operations.

This worries me, the assignment of `status_` in Return() isn't going to be atomic - so I think you either *should* take the lock, or if there's a reason not to then *perhaps* you could make `status_` be a `std::atomic` (assuming that the sequential guarantees that it provides work for what you want...)