(RAZOR-307) An initial implementation of event triggered hooks

Add support for hooks firing when certain events occur to accomodate integration into external systems.

A hook is simply an executable that is stored in a directory with the name of the event under the configured 'hook_paths' e.g:
/razor/hooks/event_name/my_exe.sh

The executable is called with a JSON representation of the node involved as the only argument.  The exe can use it if it wishes.

The executable should return a 0 exit status.  Optionally it can produce output.  If it does, it is expected to be a JSON'ed hash that will be used to update the nodes metadata.

Currently if the exe dies and produces a non 0 status, an error is logged to the nodes log that the hook failed.  It does not stop any further processing.
These error messages should also be candidates for localization; `#_` is the method alias for that.