Introduce type-safety to MIDI events

- a key signature event now takes a key and scale
- a time signature event now takes a numerator and denominator