Add futures support to QueueTask

ExecuteContext now supports a `future` keyword argument.  This will get
marked as running() when the first execute() attempt begins.

If the work generates an unhandled exception, it will set an exception
on the future (so result() will raise).  If the work completes, result
will return the return value of your QueueTask's defined execute method.

This change adds the `futures` python module as a test dependency for all
python < 3.2