2b021a9b fix(core): carry stubbed terminal outputs out of band
The paths moved out of `terminalOutput` and into a required
`stubbedTerminalOutputs` id->path map, with `terminalOutput` deleted on the
wire. The field held either bytes or a path before, distinguished only by an
optional sibling array, so a transport that stubbed but forgot to rehydrate
compiled clean and handed a plugin a filename shaped exactly like real output.
A stubbed result now carries no output at all, making that a missing value
instead.
Every transport declares the possibly-stubbed shape it actually carries
(`MaybeStubbedPostTasksExecutionContext`): the daemon client, the daemon
message type and its server handler, the plugin messaging payload,
`runPostTasksExecution`, and `LoadedNxPlugin`.
That wrapper is now the single rehydration point, so the redundant read in
`plugin-worker` is gone -- `loadResolvedNxPluginAsync` returns a
`LoadedNxPlugin`, whose wrapper rehydrates anyway. Rehydration stays there
rather than moving above the `Promise.all` in `tasks-execution-hooks`: hoisting
it would have the daemon read every output into the host process and then
re-stub for the isolated hop, which is the memory profile this change removes.
`basename()` keeps the read sink inside the cache dir. `getCustomHasher` lets a
plugin return any string for a hash, and a hash that needs stripping resolves
to a file that does not exist, which falls back to sending the output inline.
Tests pin the four behaviors that were load-bearing but unpinned: no path left
behind for an unrehydrated reader, a newly stubbable result joining an
already-stubbed context, the caller's context not being mutated, and an empty
output round tripping to `""` rather than being dropped by a truthiness check.