Movement represents a single type of exercise or, well, movement.
A Movement has many Performances and a Session can have many Movements.
An example would simply be "Squats".
Performance represents a single expression of movement. It can be as little
as a single or as much as needed. Each Performance must have a load
otherwise it is somewhat nonsensical. Outside that, a Performance may have
a count of repititions performed for the given load, a count of sets of
reps, a count of failed reps, and a unit for the load.
A Token has a type and a literal. It is the intermediate form of the source
that is used by things like the Formatter or Session to understand how
to interpret the source.
This checks for the presence of : or EOF and is used to determine
movement names and metakeys. Without a catch for EOF, this has the
potential to infinite loop on malformed sources.