UniqueQueue should not dequeue work until after execute funishes
UniqueQueue should not dequeue work until after execute funishes

As-is, UniqueQueueTask doesn't play nicely with long-running execute
methods since queue.get() removes the object from the unique "seen" set
at dequeue time.  This diff refactors the Queue Task to do the
following:

- Enables `explicit_unsee` mode in UniqueQueueTask's UniqueQueue.
- Moves work completion handling scenarios (success, unhandled error,
and trylater) in QueueTask to separate functions, sharing a common `work_done`.
- Tracks whether the dequeued work was "raw" vs. already having an
ExecuteContext.
- Uses all of the above to appropriately "unsee" the work after execution,
even in the edge case where "TryLater" is thrown on "raw" dequeued work.

bboozzoo/sparts,fmoo/sparts,fmoo/sparts,pshuff/sparts,facebook/sparts,djipko/sparts,pshuff/sparts,facebook/sparts,djipko/sparts,bboozzoo/sparts