[App Shells] staged shell rendering in cached navs (#94441)
Continuing the app shell implementation work. This PR implements
recovering *static* shells from staged dynamic requests, so that we can
recover a shell from a navigation. This is done using a byte offset,
analogous to existing recovery of the static stage.
in #93801 we already implemented the session shell codepath, in
`spawnRuntimePrefetchWithFilledCaches`, so we're not concerned with
session shells here. This means that for a navigation, we can resolve
static params in the static stage -- we don't care about recovering a
session shell, so we don't have to delay link data until the runtime
stage.
One notable difference from the previous PR is that we don't set the
byte length to `null` if the whole response is the same as the shell
stage. We don't really expect this to happen -- if a page is fully
static, it shouldn't be doing a navigation request anyway, so this
doesn't seem worth optimizing.
Highlight: changing the timing of when cookies/headers resolve affected
some Sync IO tests -- params/searchParams were now unresolved at the
abort point, and triggered a bunch of unhandled rejections. This led to
the discovery that we our unhandled rejection filter is not applied to
build validation, which is why we were seeing mysterious duplicated
error logs in those tests. This is also fixed here since now it became
more of a problem.