chore: Upgrade axum 0.7 to 0.8, deduplicate tower/tower-http (#12003)
## Summary
- Upgrade axum from 0.7.5 to 0.8.4
- Upgrade axum-server from 0.7.1 to 0.8.0
- Upgrade tower-http from 0.5.2 to 0.6 in turborepo-lib and
turborepo-devtools
## Why
The workspace was compiling duplicate versions of axum, axum-core,
tower-http, and matchit because axum 0.7 was pinned while axum 0.8 was
pulled in transitively by `tonic 0.14` and `async-graphql-axum 7.0.16`.
This upgrade aligns all consumers to a single version.
### Duplicates eliminated
- `axum` 0.7.5 (unified to 0.8.4)
- `axum-core` 0.4.3 (unified to 0.5.2)
- `tower-http` 0.5.2 (unified to 0.6.8)
- `matchit` 0.7.0 (unified to 0.8.4)
### Measurements
| Metric | Before | After | Delta |
|--------|--------|-------|-------|
| Crates compiled | 628 | 624 | -4 |
| Wall clock (clean) | 57.31s | 57.23s | ~same |
The wall-clock improvement is minimal since these crates are small and
compile in parallel with larger ones. The primary value is reduced
incremental rebuild surface, dependency consistency (no more axum
0.7/0.8 type incompatibilities), and fewer artifacts to cache.
### Code changes
- **`turborepo-vercel-api-mock`**: Route path params changed from
`/:hash` to `/{hash}` (axum 0.8 syntax)
- **`turborepo-devtools`**: `Message::Text` now wraps `Utf8Bytes`
instead of `String` (axum 0.8 WebSocket change)
Note: `tower 0.4` remains in the lockfile via `tower-lsp` (used only by
the LSP binary), which hasn't released a tower 0.5 compatible version.