Format submillisecond durations as milliseconds (#94813)
### What?
Format high-resolution durations below 2 milliseconds using fractional
milliseconds instead of microseconds. For example, 500 microseconds is
now logged as `0.5ms`.
Add colocated unit coverage for all duration formatting branches,
thresholds, and exported conversion helpers.
### Why?
Development request timing details such as `next.js` and
`application-code` should use a consistent millisecond unit, including
for submillisecond durations.
### How?
Convert nanosecond durations below the 2 millisecond threshold to
milliseconds with one decimal place. Durations at or above the threshold
retain the existing whole-millisecond formatting.
### Verification
- `pnpm exec jest packages/next/src/build/duration-to-string.test.ts
--runInBand` (26 tests passed)
- `pnpm prettier --with-node-modules --ignore-path .prettierignore
--check packages/next/src/build/duration-to-string.ts
packages/next/src/build/duration-to-string.test.ts`
- `pnpm exec eslint --config eslint.config.mjs
packages/next/src/build/duration-to-string.ts
packages/next/src/build/duration-to-string.test.ts`
- `pnpm --filter=next types`
- Broad `pnpm test-unit` invocation surfaced four
unrelated/environment-dependent failing suites, including a
network-dependent test.
<!-- NEXT_JS_LLM_PR -->