There are two phases to constant evaluation, one during semantic analysis, and another phase
performed during linking of the final assembly, on any constant expressions that were left
partially or unevaluated during semantic analysis due to external references. This trait is
used to abstract over the environment in which the evaluator runs, so that we can use it in
both phases by simply providing a suitable implementation.