Surface invalid dynamic usage errors via Flight in dev (#93706)
When a `'use cache'` recorded an invalid dynamic usage error on the work
store (for example a `cookies()` call inside `'use cache'`, a
nested-dynamic `cacheLife`, or a `'use cache'` fill timeout),
`renderToHTMLOrFlight` used to throw the recorded error right after
`renderToStream` returned. The throw bubbled up through `base-server`
and ended up rendering the Pages-Router `/_error` page, which felt out
of place in an app-router context. This change removes that throw, so
the error reaches the dev overlay through the same Flight channel that
already surfaces static-shell-validation and instant-validation errors —
`logMessagesAndSendErrorsToBrowser`, called from
`spawnStaticShellValidationInDev` and from the validation-skipped
fallback in `generateDynamicFlightRenderResultWithStagesInDev`.
The original motivation for the throw was to avoid double-logging in the
uncaught case. Without it, both React's `serverComponentsErrorHandler`
(which stamps a digest and emits a Flight error chunk) and
`logMessagesAndSendErrorsToBrowser` would forward the same error. We now
dedupe by skipping the `logMessagesAndSendErrorsToBrowser` call whenever
the recorded error already carries a `digest`, since that is exactly the
signal that React has already seen it. Caught cases (no `digest`)
continue to surface through `logMessagesAndSendErrorsToBrowser` as a
collapsed dev-overlay entry; uncaught cases surface via React's Flight
error chunk as an auto-opened redbox.
This also sets us up for the upstack PR that attaches the inner cache
call site as `cause` of the nested-dynamic prerender error. With errors
now travelling uniformly over Flight — which preserves `cause` natively
— the cause flows straight through to the dev overlay without needing to
serialize it into the error page.