An abstract syntax tree that represents pure mathematical expressions. Unlike most versions of a
tree for math, the goal is not to evaluate or transform mathematical expressions, but rather to
have a useful shared representation of various math typesetting approaches. This means that, for
instance, free variables are fine.
This module defines the Formatter trait, representing a given output format that can serialize
ASTs. This is where all of the formatting logic is held: ASTs themselves only store the
structure of data, not how that structure is represented.
This module provides an ergonomic way of defining new symbols and building up a library of
mathematical symbols to recognize and parse without custom specifications. Specifically, the
approach this module takes is to split symbols into several distinct types that share a common
structure, and then to implement generic Symbol conversions for those more specific types. This
gives us the flexibility of Symbol when we need it, but allows us to save a lot of boilerplate
when defining, for instance, every single trig function or letter.