Implement `compose_url` helper for Sinatra

This is a helper to wrap the process of building a URL from component parts,
some of which may need to be URL-escaped.  It takes many arguments, treating
each as a part of the 'relative to the app' URL, and composes them together.

Example:

    compose_url
    => '/'

    compose_url 'api', 'images'
    => '/api/images'

    compose_url 'api', 'images', image.name
    => '/api/images/correctly%20escaped%20name

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Create top level API navigation message handler

This handles an HTTP message fetching the API table: which endpoints are
available for use, and what do they do.  It includes testing and, as a side
effect, an assertion that the client is willing to accept our (only) content
response type across the board.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Implement the `create_new_image` API message handler.

This implements the create new image message, which starts the process of
loading a new ISO image into Razor, along with creating and binding components
together to allow it to be used for later installation.

Much of the work happens in the background; this simply triggers the process,
after performing appropriate validation and transformation of the image.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
REVISIT: implement the new image object in the database

This also ties in the appropriate validation, ensuring that we have correct
data passing through.

It does not, yet, validate the behaviour of validation.

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