About to begin major refactor of ASTPattern. For some reason (of course
inherent to my code), modifications made in a superclass are not
affectinging subclasses. There are a number of reasons why this can
happen, but a proposed solution is setting up ASTPattern so that it
accepts a map in its constructor. In many ways, this is wiser anyway.
Reached a cycle in my parsing. I'm doing something wrong, most likely
related to having a rotovirus infection and too many things on my plate
for the past few weeks. Proposed change: Use a visitor pattern instead.
Implement Element in every AST.
Began alteration of Parser (via oberlin.builder.parser.Parser2) to use a
Visitor pattern; currently implementing "parseProgram". This is a method
that is likely to be factored out, as it seems very specific to the
example language from Watt. I prefer Parser to be abstract.

Additionally, the list of ASTs has been modified to be final, and should
ultimately be immutable as well. The returned list is a separate list.
An additional helpful change might be to rig the program so that instead
of List<AS>, we use List<? extends Terminal>; though that could be a
small job in and of itself.

Lastly, ASTs now record their position in the code, via the class
SourcePosition. This should be particularly helpful when it comes to
reporting errors, particularly in larger programs.