Add `map()` and `submit()` to QueueTask

This adds two new helper methods for interfacing with QueueTask,
`map()`, and `submit()`.

`submit()` inserts a piece of work into the QueueTask's queue, and
returns a future that will either return a result or raise when
the task's execute() function successfully completes (or fails) the work.

`map()` takes an array of work/items, and an optional `timeout`, and
returns the `result`s for all the futures generated by submitting them
as work.  The `timeout` is applied to the delay for each individual
piece of work.

Fixes #45