Eliminate dual-engine architecture (Interpreter + Vm) in favor of
a single bytecode VM executor.
- Extract shared types (Value, FunctionProto, Closure, UpvalueObj,
Runtime trait, NativeFn) into new module
- Consolidate builtin registration in — single
used by VM, eliminates 40-line duplicate
- Delete tree-walker: exec.rs, eval.rs, interpreter.rs, env.rs, module.rs
- Change Value::Function(Rc<Function>) → Value::Function(Rc<Closure>)
eliminating the closures HashMap pointer-key hack
- Fix VM semantic gaps found during migration:
* Structural equality for Object/Array in is_equal
* CompoundAssignGlobal opcode (global compound assigns were broken)
* 9 string methods added to VM get_property
* ForInInit error on non-iterable values
- Switch run_file/run_repl to VM; remove --vm CLI flag
- Move 327 tests from interpreter/ to vm/ — all pass
Co-Authored-By: Claude <noreply@anthropic.com>