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-unbind-policy, node-bind-policy, and delete-node.

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