Asynchronous execution of hooks

Hooks could potentially be long-running. Previously, hooks
were run sequentially, meaning the hook must complete
before the original event can show as completed. That means
that e.g. the delete-node command would not finish/return
until all hooks for that event have completed.

Hooks will be executed sequentially on their own singleton
queue, and arguments (node, hook config, policy) will be
cached and then reloaded if necessary prior to running the
hook.

Fixes https://tickets.puppetlabs.com/browse/RAZOR-370