Class/Object proposed layout change for alerts.Dispatcher
Add alerts.Dispatcher with alert cancelation.

This is a work-in-process which adds the following features:

(!) This change modifies alerting subject/message. Will fix.

* Monitoring no longer sends alerts, it updates the dispatcher.

* Dispatcher powered by coroutines
  - Receives "update" messages from the monitor.
  - An update can either set, or cancel an alert.
  - Conditional waiting time read from the config
* Handles knowledge of various alert engines.
* Iteratively fires off all alerts for a given path config.

* Tests:
  - Dispatcher alerting
  - Dispatcher cancellation
  - Monitoring contacts dispatcher

* Todo:
  - Add a test that monitor contact dispatcher *async*.
  - Better naming for "cancel_timeout". Consider "alert_wait_seconds"
Refactor the Dispatcher class.

* Move it into its own file
* Have it be responsible for its own state() function
* Additional unit tests.

* Minor cleanup in monitor class.
Only install pip requirements when they are changed.
Monitor compliance as (bool,state) instead of "message".

* Renamed to _get_compliance
* Returns a tuple of (<bool>, <state>).
* "message" no longer passed around, instead generated in the dispatcher
 - May change this later to have a default, but also check the config.
* Monitor only updates the dispatcher on relevant changes.

* Multiple name changes from "status" to "state" where appropriate

* Tests
 - Monitor's conditions for dispatching and update.
 - Integration test between monitor-dispatch-send_alert
 - Improved test for /status page (too much was mocked)
 - /status test also checks that compliance is Unknown orignally.
Make 'body' an optional parameter in config file.

* Create a default message to be used as subject

* Bugfix:
 - Only create one email backend in alerts.email.EmailAlerter

* Tests:
 - Integration test from dispatcher to actual email sending.
 - Test for the bugfix above.
Multiple unrelated changes. Read commit details.

* Move zk lock from alerter to dispatcher
 - `AlerterBase` is nearly useless, but I have a gut feeling it'll be
   useful again later
* Don't pass the entire "data" object to `Dispatcher`. Only pass the
  needed information.
* Standardize "action" values
* Merge `update()` and `_update()` methods.
* Refactor async sleep function
* Merge `set_status()` and `get_status()` into `_path_status()`
* `Monitor._get_compliance` now returns (State, Reason) tuple
* Instantiate `Dispatcher` object in "runserver"

* Tests for everything above.
Move monitor.STATE to monitor.states.STATE

* Make monitor into a package, rather than single module.
* Tidy up various doctrings.
* Reword "alerts" to "alerters" where possible.
* Display path status AND message in dispatcher `status()`

* Change dispatcher status to be more JSON friendly
Merge pull request #9 from Nextdoor/proposed_alert_dispatcher

Closes #4: Create an alert dispatcher with cancellation