Add `connection()` as a new dynamic API (#69949)
In https://github.com/vercel/next.js/pull/68812 I updated most dynamic
APIs to be async. One API that was not udpated was `unstable_noStore()`.
This API is marked as unstable and doesn't quite fit the semantics we're
exploring with dynamicIO and partial prerendering and so rather than
converting it to be async we're going to deprecate it and replace it
with an entirely new API.
This PR doesn't actually deprecate anything yet but it does introduce
`connection()`.
The idea with `connection` is that you are waiting until there is a real
user Request before proceeding. In the context of prerendering no
Request will ever happen so the page cannot produce a static result.
(this is similar to how `unstable_noStore()` works today).
In a PPR context the currently rendering component won't resolve but a
parent Suspense boundary can still statically render a fallback.
`connect()` returns a `Promise<void>`. It is tempting to call the API
`request()` and return a `Promise<Request>` however we have to guard
access to the underlying Request carefully to ensure we can maximally
prerender pages and to avoid confusion and maybe some frustration we are
naming it `connection` since this doesn't imply a specific data set that
might be returned.
```
import { connection } from 'next/server'
async function MyServerComponent() {
await connection()
// everthing after this point will be excluded from prerendering
const rand = Math.random()
return <span>{rand}</span>
}
```