refactor a bit, and make the task runner capable of having tasks enqueued async'ly (NO REASON). tests.