It's split off to avoid cluttering Theory, but also because the
Derive.Scale import would make it a circular dependency.

This is basically just a bunch of functions that take a million arguments
to configure octave format, accidental format, key parsing, etc. To
avoid annoyingly long argument lists, they are mostly packaged up into
records, such as Config, KeyConfig, and RelativeFormat.

It's basically all just an attempt to parameterize scale creation, so I
can reuse the shared parts but still be able to configure them. It winds
up being complicated, probably due to how it's evolved in reaction to
increasingly varied scales, rather than according to an overarching design.

relative

The Pitch.Pitches handled by a relative scale are still absolute, exactly
the same as the Pitches of an absolute scale. The difference is that the
read_pitch and show_pitch functions adjust based on the key to display
the absolute Pitch relative to the tonic of the key.

Format

This is the central data structure for this module. It has the set of
functions needed to parse and generate symbolic pitches. Making one of
these gives you access to the set of functions in here, such as show_pitch
and read_pitch, which in turn can be used to implement
a Scale.

keyed relative

Like show_degree_chromatic, but format the accidentals as staff notation
does, in that accidentals implicit in the key signature are omitted, and
a natural that differs from the key signature is emitted.
TODO tons of args, can I package some up?