This provides filename/line/column context for any error I could possibly find.
To achieve this, I made it so that all ScoreUpdates have source context, so when
updating the score results in an error, we can print out the line and column
number corresponding to the error.
It's a bit more complicated than that, because score updates are nestable (e.g.
event sequences can contain cram expressions can contain chords, etc.), which
essentially gives us a stacktrace whenever a score update results in an error. I
punted on giving the user the full stacktrace, in favor of doing something
simpler and just showing the bottom-most error, because that's probably going to
be the line and column number that's the most helpful.
1. Added column to parse error messages.
2. It turns out that we weren't even keeping track of the line and column where
a token starts, let alone including it in the error message. Added
`startLine` and `startColumn` fields to the scanner struct, made it so that
they get updated in sync with the `start` (i.e. start index) field, and made
it so that we're using the start line and column in error messages, instead
of the _current_ line and column, which was less helpful.
In accordance with the "don't make invalid data representable" principle.
This also allows us to create a LispPitch type in alda.lisp, which will just
wrap PitchIdentifier.