Add hooks as first-class objects

Hooks are a way to augment Razor with functionality when certain events occur.
Most/all hooks will involve node events, e.g. binding to a policy.

When a hook runs, it receives (as JSON) some metadata about the node and the
hook. When the hook finishes running, it can do several things:
- Exit with various status codes; 0 means success, any other means failure.
This will be recorded temporarily in the hook and permanently in the generated
event.
- Write to stdout; This can be either JSON or any string. If the string is
not JSON, it will be included in the generated event. If it is JSON, the
'hook' key can update the configuration of the hook; the 'node' key can
update the metadata of the node; the 'error' key holds any error(s) generated
by the hook; and the 'output' key holds any extra messages to include in the
generated event.

A generated event will be created whenever a hook's event script finishes
running.

Fixes https://tickets.puppetlabs.com/browse/RAZOR-368
Add `create-hook` and `delete-hook` commands

This adds methods for instantiating and deleting the configuration for a hook.

Fixes https://tickets.puppetlabs.com/browse/RAZOR-368
Triggering hooks for certain events

This adds hooks for node-unbound-from-policy, node-bound-to-policy,
node-deleted, node-booted, node-facts-changed, and
node-install-finished

Fixes https://tickets.puppetlabs.com/browse/RAZOR-369
Add `razor hooks` query

The user needs to see which hooks have been instantiated in the application.
This new command will return that list and display the configuration for
each.

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