Feature/exercise chord visuals

This PR adds the ability to see correct and incorrect notes that are played on the staff.

*Implements functionality*
- When an incorrect note is played, it's rendered as a yellow note.
- When a correct note is played, it's rendered as a black note.
- When the chord is waiting to be matched, the notes should be grayed out.
- When the chord to be matched has an identifiable root or has tritones, these notes should be highlighted.

*Technical Synopsis*
- Added the ability to set arbitrary data properties on a note in a `Chord`. The intent was to use this to associate a `correctness` property with each note so that when the notes are rendered on screen, the correct/incorrect notes can be rendered differently. 
- Added `ExerciseChord` and `ExerciseChordBank` classes derived from `Chord` and `ChordBank`.
- Refactored `StaveNoteFactory` into `ExerciseNoteFactory` and `PlayNoteFactory`. Since exercise and play mode have different requirements, the specific functionality for creating notes to display on screen was put into separate classes.
- Refactored `ExerciseContext` to generate two types of chords: one for displaying on screen (chord to match + what the user played) and another used internally for analysis (just the exercise chord).
- Updated the `ExerciseGrader` grading method.

*Testing*
- [http://localhost:8000/lab/exercise/2](http://localhost:8000/lab/exercise/2)

--- 
JIRA: [HLAB-35](https://jira.huit.harvard.edu/browse/HLAB-35).