Implementing asynchronous task queues