Expression support, including ChangeVar effect
 - Can parse, evaluate and serialize strongly-typed expressions
 - Implements most common operations (easily extensible)
 - Caches constant results to avoid re-evaluation
 - Throws nice exceptions to complain about runtime evaluation problems

Expressions can be built by parsing a lisp-like representation
(see Parser.parse()) or composing Literals, VariableRefs, and Operations

Expressions are evaluated by calling evaluate() on a given VarsContext