Introduce the concept of "forced runtime" to the interpreter.

The interpreter's normal behavior is to run as much as possible of the
program at compile time. This adds a new capability to indicate that
a section of the code is to be evaluated at runtime, which means:

- all variables behave as if their value is unknown, forcing them to be
  evaluated at runtime.

- assigning to any variable causes its value to *become* unknown, so that
  the generated code can be used in a context where it will run an unknown
  number of times at runtime.

- assigning to constants is forbidden, again to allow the generated code
  to be safely used in spots where we can't predict how many times the
  code will run. (the value of a constant must be known at compile time.)
Correct and simplify the handling of while loops.

Previously the rules for while loops were complicated, and to make matters
worse we made some incorrect assumptions in our handling of generating
a while loop for runtime.

This change simplifies the rules for while loops so that they are only
evaluated at compile time if they can be completely removed from the
runtime code. If any part of the while loop cannot be handled at compile
time, we use the "force runtime" interpreter feature to produce a
runtime version of the loop.