add a remove() method

to allow to remove a work item from the pool/queue
track and propagate the task tag
support for timeout notification

client code can supply a (non-blocking!) callback to move
the decision about what to do with a blocked task from the watcher
to the client.

Client can also use this machinery just to be notified a task
is styck.
simplify WorkQueue.fetch

introduce a _get helper method.
just because we want to keep `periodic' as implementation detail.