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

I've looked into this, and what makes it safe even with looser memory models is that any thread pool would have its own synchronization that would add the appropriate memory barriers to make this safe.