[Cache Components] Discriminate static shell validation errors by type
Prior to this change any "hole" in a prerender that would block the shell was considered an error and you would be presented with a very generic message explaining all the different ways you could have failed this validation check.
With this change we use a new technique to validate the static shell which can now tell the difference between waiting on uncached data or runtime data. It also improves the heuristics around generateMetadata and generateViewport errors.
I added new error pages for runtime sync IO and ensure we only validate sync IO after runtime data if the page will be validating runtime prefetches.
I restored the validation on HMR update so you can get feedback after saving a new file.