Add lifecycle e2e coverage for replacement races and untracked updates
- Slow-link triple click: three real clicks on the same link while each
previous dynamic fetch (2s middleware delay) is in flight; the last
commits, the two older transitions abort attributed to that commit.
- Same-page link click: a push to the current page reports a normal
start/commit pair with identical from/to routes.
- Query-param-only navigation: route identity unchanged, searchParams
and canonicalUrl reflect the new query.
- Shallow history.pushState: emits no lifecycle events, but the next
transition's `from` reflects the shallow-updated URL.
- Hash-only navigation: also assert the hash-bearing canonicalUrl.