Handle async operations

* use Date.now()
* bind context to `pause` and `stop`
* ensure command order when setting statuses

We need to wait for status event emitting before trying to get new tasks. So that if the user wants to pause the worker
after a status change, it can.