feat: add experimental QuickJS backend (#36194)
## Summary
- add a `deno_v8` facade crate that re-exports either upstream
`rusty_v8` or [`v8x`](https://github.com/littledivy/v8x)
- keep V8 as the default backend while exposing mutually exclusive `v8`
and `quickjs` Cargo features through `deno_core`, `deno`, `denort`, and
`denort_desktop`
- add an `--engine v8|quickjs` flag to `deno compile` / `deno desktop`
that selects the runtime the produced binary uses, and publish the
QuickJS `denort` / `libdenort` artifacts it resolves
- make workspace lint and CI package selection aware of the mutually
exclusive engine features
The v8x dependency is pinned to an exact release candidate on crates.io
(`v8x = "=149.4.0-rc.1"`). It currently tracks a different V8 line (149)
than the default `v8` crate (150), so the two are bumped independently;
the pin will move to a stable v8x release once one is published.
The unrelated fixes that earlier rode along on this branch (the
`#[op2(reentrant)]` heap-op change, the uv timer-deadline fix, the
snapshot object-identity test, the `node_test_mock_timers` determinism
fix, and the `tests/util/server` feature additions) are no longer part
of this PR, so the QuickJS backend can be reviewed on its own.
## Building
The existing V8 build remains unchanged:
```sh
cargo build --bin deno
```
Build Deno with QuickJS:
```sh
cargo build --bin deno --no-default-features --features quickjs
```
Build the standalone runtime used by compile output with QuickJS:
```sh
cargo build -p denort --no-default-features --features quickjs
```
## Validation
- `cargo check --locked -p deno_v8 --no-default-features --features
v8,simdutf`
- `cargo check --locked -p deno_v8 --no-default-features --features
quickjs,simdutf`
- `cargo build --locked --bin deno`
- `cargo build --locked --bin deno --no-default-features --features
quickjs`
- `./tools/lint.js --js`
---------
Co-authored-by: Divy Srivastava <me@littledivy.com>