perf: evaluate `USize`, `UInt64` and `Array.uget`/`uset` primitives in place in the interpreter

This PR makes the IR interpreter evaluate `USize`, `UInt64` and `Array.uget`/`uset` primitives in place instead of calling their boxed native wrappers. A full Mathlib build executes 3.6% fewer instructions.

Previously, each call to a primitive such as `USize.add` or `Array.uget` (e.g. the index arithmetic of every compiled `for` loop) heap-allocated boxes for its scalar arguments and result, and pushed an interpreter frame. `call` now invokes the `lean.h` function directly, respecting the IR borrow flags. Primitives are recognized by name once per process and cached in the global native symbol cache.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3 files changed