Fix os.environ panic in JS bindings, return NotImplementedError instead
A human discovered that `os.environ` via `start()` in the JS bindings
caused a Rust panic (process crash) instead of returning a graceful
error. This was because `progress_to_result()` used `panic!()` for
`RunProgress::OsCall`, unlike the Python bindings which return a
`NotImplementedError`. The same issue existed for `OsCall` in
`run_with_external_functions()` which returned a plain napi `Error`
instead of a `MontyRuntimeError`.
Both paths now return `JsMontyException` with `NotImplementedError`,
matching the Python bindings behavior. The `ResolveFutures` panic in
`progress_to_result` is also replaced with a graceful error.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Address review feedback on math module
- isqrt: use `x > n / x` instead of `x * x > n` to avoid i64 overflow
for large values near sqrt(i64::MAX)
- value_to_float: add #[expect(clippy::cast_precision_loss)] with reason
documenting that i64-to-f64 precision loss matches CPython semantics
- frexp: simplify exponent calculation to `exponent_bits - 1022` instead
of the equivalent but confusing `exponent_bits - 1023 - 52 + 1 + 52`
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>