Update server registration call to return the decoded response body

The response body from the Razor server, presently, includes the one and only
synchronous command that we will process.  Consequently we must return that
from the registration RPC request in order to be able to take action on it.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Fix `bin/mk` error when command is not supplied

Using `to_s` on the value in ARGV would result, sadly, in the nil value
turning into an empty string -- and while it still failed, it did so with a
confusing report about a missing "empty" command.

This fixes that, and adds a test to ensure that the error reports are correct.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Fix `bin/mk` error that would result in all calls failing

Unfortunately, the catch grabbed `SystemExit` as well as other errors; this
fixes that by moving the exit outside the try/catch block.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Implement server command execution using external binaries

This implements a simple pattern for execution of commands from the server:
a "whitelist" in the form of a directory on disk is used.  Any command will be
executed as requested by the server, provided that it exists in
that directory.

This makes it easy to both expose an entire command (eg: `reboot`, or `yum`),
or to provide a wrapper that limits the possible arguments to the command.

Nothing on the normal execution path is trusted, although that can be
overridden by setting, eg, `razor.commands=/bin` in the configuration.

Right now only a single directory is supported, although it would be
reasonably easy to extend this to a full set of paths, or provide other
mechanisms to extend the whitelist for other commands.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>