Simplify KeySignatureMaps

KeySignatureMap objects are replaced with KeySignature objects. Instead
of tracking which modifier (sharp, flat, natural) should apply to every
note, a KeySignature tracks which notes should be affected by which
modifier. This makes it possible to mathematically generate signatures
for every mode, and will make it easier to track accidentals in a
measure.
Handle modes and enharmonics

Understand key signatures for any mode. This opens up the possibility of
encountering notes like "C flat", so we introduce a function to respell
(for example) Cb as B.
Track accidentals within a measure

KeySignature has facilities to track which accidentals are active. We
set those fields when we see an accidental, and clear them every time we
cross a barline.