Iteratively force a value — forces all thunks inside constructors,
producing a fully-evaluated tree with no ThunkRef values.
Uses an explicit work stack instead of recursion to handle deep
structures (e.g. 1000-element lists) without overflowing the Rust stack.
Create an environment pre-populated with data constructor functions.
Each constructor with arity N becomes a ConFun(tag, N, []) value
bound to its worker VarId, so that Var references to constructors
in the expression tree resolve correctly.