feature/exercise component

This PR adds an exercise component to the application in addition to the normal sandbox/play mode The exercise mode is very basic at the moment because some groundwork needed to be done first (and that also contributed to the larger size of this PR, which probably should have been split off into mini branches).

As a result of this work, when a student visits an exercise at [http://localhost:8000/exercise/1](http://localhost:8000/exercise/1), they should see a chord on the staff that they should try to play. When they play an incorrect note, they should see a message on screen that says INCORRECT and when they play the chord correctly, they should see a CORRECT message. Notes that the student plays are not rendered on screen at the moment, but the keys on the on-screen piano should respond to whatever is played.

Here's a brief overview of the changes:
- Added an `AppExerciseComponent` that coordinates the display and interaction of the exercise. This is the root component. For sandbox mode, its counterpart is the `AppPlayComponent`.
- Added a simple router object to select which root component to use. This router component is not strictly necessary, since we could instantiate with the "App" components from the appropriate django template, but doing so would mean that the way the app builds and minifies the JS into one "main" file would have to be modified. That might be the way to go, but for now the router is OK.
- Added an `ExerciseSheet` in addition to the `PlaySheet` component. These are used by the `MusicComponent` to render notes and other notation on screen.
- Added an `ExerciseContext` model object that coordinates the grading, display, and status of the exercise. It delegates some responsibilities to the `ExerciseDefinition` and `ExerciseGrader` models, which are responsible for knowing the exercise description and how to grade an exercise respectively.
- Added unit tests for the new model objects and also refactored as necessary to facilitate the exercise components. See the jasmine test runner at [http://localhost:8000/jasmine](http://localhost:8000/jasmine).

@MichaelDHilborn-Harvard Can you review the `AppExerciseComponent`, `ExerciseDefinition`, `ExerciseGrader`, and `ExerciseContext` objects. Feel free to review anything else, but I'd like to focus on these since there's quite a lot here. Thanks!
This, as we discussed, seems a little wonky; perhaps use numeric variables to tally this?