Allow pos_link to be used for unknown positions.

There's no call for doing this at runtime, but it's handy when testing.
Allow symbols to have unknown value but known type.

This can occur if two branches give a variable different values but those
values have the same type. In that case, we know enough to generate the
right code at compile time even though the exact value is not known until
runtime.
Add an interface for "evaluating" AST expressions.

This really means checking the expression and, if it's valid, transforming
it into another expression that will be fed into the code generator.
Special AST nodes for resolved values and symbol storages.

These are never emitted by the parser, but the interpreter will emit these
once it's bound source expressions to real symbols and values, and these
will be used to emit the right references during code generation.

Therefore these AST nodes are only valid in the code generation tree, not
in the parse tree.
Implement evaluate() for the SymbolExpr.
ValueExpr and SymbolStorageExpr just evaluate to themselves.

There isn't really any reason to call these functions directly, but it's
nice to have them here to complete the interface and to give us an
effective way of stubbing out child node slots of other nodes for tests.