chore: Extract run/cache.rs to turborepo-run-cache crate (#11348)
## Summary
- Create new `turborepo-run-cache` crate with task-aware cache logic
- Move `TaskDefinitionExt` and `TaskOutputsExt` traits to
`turborepo-types`
- Delete `crates/turborepo-lib/src/run/cache.rs`
## Details
This continues the turborepo-lib modularization effort, extracting
reusable cache logic to a focused crate.
### New crate: `turborepo-run-cache`
Contains:
- `RunCache` - Wraps `AsyncCache` with task-aware semantics (log files,
output globs, daemon integration)
- `TaskCache` - Per-task cache state and operations (restore, save,
replay logs)
- `ConfigCache` - Cache for configuration files
- `CacheOutput` trait - Interface for outputting cache status to users
- `RunCacheOpts` - Options for cache behavior
### Moved to `turborepo-types`
Extension traits that operate on types already in turborepo-types:
- `TaskDefinitionExt` - `workspace_relative_log_file()`,
`repo_relative_hashable_outputs()`
- `TaskOutputsExt` - `validated_inclusions()`, `validated_exclusions()`,
`is_empty()`
### Why this extraction?
The cache logic is **reusable domain logic**, not orchestration:
1. It wraps `AsyncCache` with task-aware semantics
2. It's used by the visitor during task execution
3. It could be reused by other tooling (cache inspection, testing
utilities)
4. It doesn't depend on CLI args or the `Run` struct
This moves turborepo-lib closer to being a thin orchestration layer.
## Testing
- `cargo check -p turborepo-types` ✅
- `cargo check -p turborepo-run-cache` ✅
- `cargo check -p turborepo-lib` ✅
- `cargo test -p turborepo-lib --lib` ✅ (313 tests)