Add lazy assignment
Add lazy assignment

Values assigned to names are now stored without being executed first.
Values are evaluated when they are requested.

For example `a: Int = 1 + 1` stores `1 + 1`. If `a` is later retrieved
from the symbol table, it will then be evaluated to `2`.

This enables a function to store a block under a parameterized name
without executing it. When the function's value is retrieved it will
then be executed within its environment closure.

apollo-lang/apollo