Add callbacks for workers and the queue

This adds the ability to configure callbacks on a worker pool for
its workers and queue. This allows tools using worker pool to
trigger logic as workers go through their lifecycle and when work
is added or removed from the queue. This is needed for `Qs` to only
fetch work when a worker is available and to also allow it to wait
for the worker pool's queue to empty. It will use the callbacks
to wake up its thread, when a worker is waiting or when pop is
called on the queue.