Add Redis configuration and connection

This adds configuring redis for all of Qs and also adds a utility
for building a redis connection. Qs will build a redis connection
when init which it will use to add jobs and publish events. Daemons
will also build redis connections for pulling jobs off of a queue.
Daemons will also use the global Qs redis configuration for
building their connection.
Merge pull request #27 from redding/jcr-config-init

Add Redis configuration and connection
Add `DaemonData`

This adds a `DaemonData` class which handles "compiling" a daemons
configuration. This is done for speed and to provide a simple
object for passing around the daemon configuration. This also
provides methods for easily looking up a route, which will be used
to run a job handler.
Merge pull request #26 from redding/jcr-daemon-data

Add `DaemonData`
Add `JobHandler` mixin

This adds a `JobHandler` mixin that implements our handler pattern
for Qs jobs. This will allow defining handler classes for
processing background jobs.
Merge pull request #28 from redding/jcr-job-handler

Add `JobHandler` mixin
Add runners for live and test environments

This adds a `Runner`, `QsRunner` and `TestRunner`. This provides
a live runner, a test runner and the common logic between them.
The runner, in both live and test environments, is responsible
for building a handler class and running it appropriately. This
is part of working with the handler pattern and allows also
unit testing handlers without having to know Qs implementation
details.
Merge pull request #29 from redding/jcr-runner

Add runners for live and test environments
Add `Job`, handles converting to/from payloads

This adds a `Job` class that handles converting a name and params
to and from a payload hash. This will be built when adding a job to
a queue and will be used to parse a payload pulled out of redis.
The `Job` instance is passed down to the handler for use in
handling the background job. A `Job` also includes a `created_at`
that references the time it was added to a queue. This can be
used to detect when an action occurred as opposed to when the
background worker decided to finally handle the job.
Merge pull request #30 from redding/jcr-job

Add `Job`, handles converting to/from payloads
Update `ErrorHandler`, match Sanford error handler

This updates the `ErrorHandler` to behave similar to Sanford's
error handler. It takes an exception, a daemon data and an
optional job. This is because the error handler is called if any
exception occurs while handling a payload and a job may not have
been parsed when the exception occurs. The daemon data's error
procs are called and passed the exception, daemon data and job.
If an error proc raises an exception, the new exception will be
passed to any subsequent error procs and the last exception that
is thrown will be logged by the daemon. This is to avoid any
errors being "hidden" and behaves the same as a bunch of nested
begin-rescue-end statements.
Merge pull request #31 from redding/jcr-error-handler

Update `ErrorHandler`, match Sanford error handler
Implement `Route#run`

This adds the logic for running a route. It will build and run a
`QsRunner`, passing the job, the job params and the daemon data's
logger to it. The route was implemented before the runner or job
so it was left as a todo. This is needed to run a job handler when
a job is pulled off of a queue.
Merge pull request #33 from redding/jcr-route-run

Implement `Route#run`
Add `PayloadHandler`, processes a serialized payload

This adds a `PayloadHandler` which handles all the logic for
processing a serialized payload. When run, it parses the serialized
payload, builds a job, finds a route for the job and then runs
the route. The `PayloadHandler` also handles logging, catching
errors and timing how long it took to run the job. When an error
occurs, the exception, daemon data and the job are passed to an
error handler which is run. This allows users to report errors or
do other special behavior if needed.

Finally, this also includes a `Payload` module that handles
encoding and decoding a payload. Qs uses `Oj` to convert a payload
into and out of JSON.
wip