401a07cc

Run mutation children under the locale every other test gets

## What

`mutationCheck` builds its coverage and mutation phases with a bare
`pkgs.stdenv.mkDerivation`, which sets no locale. Every other test derivation
goes through the Haskell generic-builder, which sets `LANG=en_US.UTF-8` and
`LOCALE_ARCHIVE`. So the same test suite runs under a different locale here
than it does anywhere else, including under `cabal test` and under the
package's own check.

This gives it that locale.

## Why it matters

PostgreSQL's `initdb` takes the database encoding from the locale. With `LANG`
unset it makes an **SQL_ASCII** cluster; with a UTF-8 locale it makes a
**UTF8** one. On SQL_ASCII, `SUBSTRING` counts bytes rather than characters, so
a query that abbreviates a multi-byte string returns a half-finished character
and the connection fails with:

```
SqlError { sqlState = "22021"
         , sqlErrorMsg = "invalid byte sequence for encoding \"UTF8\": 0xf3 0x94 0x84" }
```

That reads as a flaky test rather than as a difference in environment, and it
is reachable only through this check, which is what made it expensive to find:
it cost a day in nix-ci, where it looked like three separate flaky tests in a
row. Write-up: https://github.com/NorfairKing/nix-ci/issues/762

## Evidence

Same binary, same seed, same generated values; only the locale differs.

| environment | cluster | result |
|---|---|---|
| nix sandbox, no locale | SQL_ASCII | fails, deterministically on seed 42 |
| nix sandbox, `LANG=en_US.UTF-8` + `LOCALE_ARCHIVE` | UTF8 | passes |
| outside a sandbox, inherited `LANG=en_US.UTF-8` | UTF8 | passes, 400 iterations |

And the check this was blocking, built against this branch with
`--override-input sydtest`:

```
Killed: 2527   Survived: 0   Uncovered: 0
Controls passed: 197   Controls failed: 0
```

Before: the same check failed one control on four runs out of four.

## Note

`LOCALE_ARCHIVE` is set only when `hostPlatform.libc == "glibc"`, matching what
the Haskell generic-builder does.

Every mutation derivation's hash changes, so the first build after this is a
cold one everywhere.

Total

2h02m46s

Created Started Finished

Time to Start Worker time Duration Time to finish Idle
Config 21m23s 1s 1s 21m24s 21m23s
Eval 22m56s 1m48s 1m48s 24m45s 1m31s
Build 24m45s 2m50s 1h59m25s 2h24m10s 1h56m34s
Suite 21m23s 4m40s 2h02m46s 2h24m10s 2h19m30s

Timeline

Config Eval Build Compressed gap
0s23m23m20s23m40s24m24m20s24m40s2h21m2h21m2h22m2h22m2h23m2h23m2h23m2h24m