Add cabal v2-build-based component builder ("v2 builder")
Adds an alternative component builder that runs `cabal v2-build` inside a slice derivation and emits a cabal-store layout rather than going through Setup.hs, alongside the existing Setup-based v1 builder. Selected per-project via the new `builderVersion` option (default `1` for now; flip to `2` to opt in on a per-project basis). What the v2 builder provides: * Per-component cabal-store slices that compose into a single `~/.cabal/store/ghc-<version>/` layout via `composeStore`. Each slice's UnitId matches what a downstream `cabal v2-build` would compute against the real compiler, so a v2 store can be reused by interactive cabal invocations without recomputation. * Public sublibrary support (`library <n>` stanzas) end-to-end — not currently supported by v1's Setup-based path. * A v2 dev shell (`shell-for-v2.nix`) wired through `project.shellFor` whenever `builderVersion = 2`. Two exposure modes: `cabal-store` (default) pre-populates `~/.cabal/store` so plain `cabal v2-build` reuses the slice's units; `ghc-pkg` mode wraps `ghc` / `ghc-pkg` with `GHC_ENVIRONMENT` / `GHC_PACKAGE_PATH` so `ghc -e` and similar see the composed store directly. * A shared ghc shim (`ghc-shim.nix`) used by both the slice's `cabal v2-build` and the v2 shell so the user-facing compiler matches the slice compiler. Adds cabal near-compiler aliases, patches the ghcjs `ar command` setting (drops missing `.o`s for backpack-on-ghcjs), and adds native-musl `unlit` / `ghc-iserv[-dyn|-prof]` aliases. Plumbing changes: * `builder/default.nix` + `builder/hspkg-builder.nix` dispatch on `builderVersion`. v2-specific helpers (`buildCabalStoreSlice`, `composeStore`, `makeGhcShim`, the patched `v2CabalInstall`) live in `builder/default.nix`. * `modules/project-common.nix` adds `builderVersion`. `modules/component-driver.nix` propagates it (plus `crossTemplateHaskellSupport` and `cabalProjectLocal`) into the pkg-set config. `modules/stack-project.nix` forces v1 for stack projects (stack-to-nix doesn't produce the plan-json shapes v2 consumes). * `modules/package-options.nix` adds round-trip options (`configureOptions`, `extraLibDirs`, `extraIncludeDirs`, `programOptions`) that v2 emits back into each slice's cabal.project. * `modules/install-plan/configure-args.nix` extracts those round-trip options from plan.json's configure-args, and filters `-hide-all-packages` for v2 (cabal injects it on every Setup configure call; round-tripping it would fork UnitId hashes between plan-nix and slice cabal). * `modules/install-plan/non-reinstallable.nix` skips the ghcjs/wasm boot-package hiding on v2 (v2 follows cabal's plan literally rather than overlaying haskell.nix's exclusions). * `modules/shell.nix` adds the `exposePackagesVia` option. * `lib/check.nix` adds a v2-slice branch that runs the installed exe under the platform's testWrapper, mirroring the v1 check semantics for slice derivations. * `overlays/haskell.nix` propagates `builderVersion` / `cabalProjectLocal` through `addProjectAndPackageAttrs`, dispatches `shellFor` on `builderVersion`, and rebuilds iserv-proxy as both a non-profiled and profiled variant — v2 reads the prof variant from `package iserv-proxy profiling: True` in cabal.project rather than `enableProfiling = true` on the .override (which v2 doesn't honour). * `overlays/linux-cross.nix` + `overlays/mingw_w64.nix` add a `wrapGhc` derivation that bakes `-fexternal-interpreter -pgmi <iserv-wrapper>` into ghc itself — v2 can't put those into per-package `ghc-options:` (UnitId divergence), so it wraps the compiler instead. The `compilerSelection` chain picks the wrapped ghc on cross targets. Internal projects pin v1: * `compiler/ghc/default.nix` (hadrian) and `overlays/bootstrap.nix` (hscolour) set `builderVersion = 1` explicitly so v2 evolution doesn't churn GHC builds while v2 is still settling. `overlays/tools.nix` defaults `haskell-nix.tool` invocations to v1 for the same reason. Tests are NOT migrated in this commit — the existing tests run under v1 (the default) and exercise master's behaviour as before. A follow-up will migrate or duplicate them under v2 once we know which expectations need adjusting.