c27c125e

By: Ben Ruijl <ben@ruijl.ch>

fix spynso pyodide compilation

Separate portable and native features through the Python adapter and HEP
library, gate native evaluator exports and stubs, and add a WASM build check.

Original user request:

Fix the Python WASM compilation for spynso, so that it works with pyodide.

```
# One-time setup
python3.14 -m venv .venv-wasm
source .venv-wasm/bin/activate
pip install pyodide-build==0.39.0 maturin==1.15.0

export PYODIDE_XBUILDENV_PATH="$HOME/.cache/symbolica-pyodide"
pyodide xbuildenv install 314.0.7
export RUSTUP_TOOLCHAIN="$(pyodide config get rust_toolchain)"
rustup toolchain install "$RUSTUP_TOOLCHAIN" \
  --profile minimal --target wasm32-unknown-emscripten
```

```
pyodide build . --outdir dist --no-isolation \
  -C maturin.build-args="--locked --profile release-small \
  --no-default-features --features wasm \
  -- -C link-arg=-sEXPORTED_FUNCTIONS=_PyInit_core"
```

pyodide build . --outdir dist --no-isolation \
  -C maturin.build-args="--locked --profile release-small \
  --no-default-features --features wasm \
  -- -C link-arg=-sEXPORTED_FUNCTIONS=_PyInit_core"

Follow-up request:

Create the PR
GitHub
gammaloop-clippygammaloop-fmtgammaloop-guppy-workspace-graphgammaloop-nextest-binaries-clinnetgammaloop-nextest-binaries-coregammaloop-nextest-binaries-docsgammaloop-nextest-binaries-integrationgammaloop-nextest-binaries-linnetgammaloop-nextest-binaries-python-apigammaloop-nextest-binaries-spensogammaloop-nextest-binaries-vakintconfiguredeploy:nix-ci-passedcargoArtifactscargoCheckArtifactscrate-deps-gammaloop-workspace-hackcrate-test-binaries-alphal00p-docs-buildercrate-test-binaries-alphal00p-docs-catalogscrate-test-binaries-alphal00p-docs-examplescrate-test-binaries-alphal00p-docs-macroscrate-test-binaries-alphal00p-docs-python-exportercrate-test-binaries-alphal00p-docs-schemacrate-test-binaries-clinnetcrate-test-binaries-gammaloop-apicrate-test-binaries-gammaloop-integration-testscrate-test-binaries-gammaloop-tracing-filtercrate-test-binaries-gammaloop-tracing-filter-macroscrate-test-binaries-gammalooprscrate-test-binaries-idensocrate-test-binaries-kurvstcrate-test-binaries-linnestcrate-test-binaries-linnetcrate-test-binaries-linnet-pycrate-test-binaries-spensocrate-test-binaries-spenso-hep-libcrate-test-binaries-spenso-macroscrate-test-binaries-spynso3crate-test-binaries-symbolica-utilscrate-test-binaries-vakintcrate-test-dependencies-alphal00p-docs-buildercrate-test-dependencies-alphal00p-docs-catalogscrate-test-dependencies-alphal00p-docs-examplescrate-test-dependencies-alphal00p-docs-macroscrate-test-dependencies-alphal00p-docs-python-exportercrate-test-dependencies-alphal00p-docs-schemacrate-test-dependencies-clinnetcrate-test-dependencies-gammaloop-apicrate-test-dependencies-gammaloop-integration-testscrate-test-dependencies-gammaloop-tracing-filtercrate-test-dependencies-gammaloop-tracing-filter-macroscrate-test-dependencies-gammalooprscrate-test-dependencies-idensocrate-test-dependencies-kurvstcrate-test-dependencies-linnestcrate-test-dependencies-linnetcrate-test-dependencies-linnet-pycrate-test-dependencies-spensocrate-test-dependencies-spenso-hep-libcrate-test-dependencies-spenso-macroscrate-test-dependencies-spynso3crate-test-dependencies-symbolica-utilscrate-test-dependencies-vakintgammaloop-python-modulenix-ci-check-gammaloop-doctestnix-ci-check-gammaloop-nextest-clinnetnix-ci-check-gammaloop-nextest-corenix-ci-check-gammaloop-nextest-docsnix-ci-check-gammaloop-nextest-integrationnix-ci-check-gammaloop-nextest-linnetnix-ci-check-gammaloop-nextest-python-apinix-ci-check-gammaloop-nextest-spensonix-ci-check-gammaloop-nextest-vakintnix-ci-passedx86_64-linuxtest:nix-ci-check-gammaloop-doctesttest:nix-ci-check-gammaloop-nextest-clinnettest:nix-ci-check-gammaloop-nextest-coretest:nix-ci-check-gammaloop-nextest-docstest:nix-ci-check-gammaloop-nextest-integrationtest:nix-ci-check-gammaloop-nextest-linnettest:nix-ci-check-gammaloop-nextest-python-apitest:nix-ci-check-gammaloop-nextest-spensotest:nix-ci-check-gammaloop-nextest-vakint