Fix the tornadomail installs.

Do the tornadomail install in the Makefile directly from GitHub,
then install the rest of the requirements via the requirements.txt
file.
Hardcode the tornadomail SHA1 to the current master
Merge pull request #6 from Nextdoor/fix_tornadomail_installs

Fix the tornadomail installs.
Merge pull request #7 from siminm-nextdoor/master

Set content type explicitly to 'text/json'
Architectural documentation additions.
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
Fix setup.py install.
Use an https link instead of git+git.
Merge pull request #10 from Nextdoor/fix_dependency_install

Fix setup.py install.
Standardize alerter engines.

* Each engine receives the following data:
 - `path`: zk path that is alerting.
 - `state`: the state that is being alerted.
 - `message`: reason generated for given state.
 - `params`: arbitrary data from the config (yaml) for the given alert.

With this setup engines like Email or Hipchat can manipulate the data
enough to construct a well-read subject/body/notification.
Alert on "Now in Spec"

* Dispatcher metadata now includes an alert status for "SENT"
* Receiving a "Now OK" update from the monitor decides to either cancel
  the pending alert or send out the "Now in Spec" alert.
Merge pull request #12 from Nextdoor/now_in_spec

Add "Now in Spec" follow up alert.