chore: Move `TaskDefinition` from `turborepo-lib` to `turborepo-types` (#11335)
## Summary
This is **Phase 1.1** of the turborepo-lib modularization effort, moving
the `TaskDefinition` struct from `turborepo-lib` to `turborepo-types`.
## Changes
- Add `TaskDefinition` struct to `turborepo-types` crate
- Add `turborepo-errors` and `turborepo-task-id` dependencies to
`turborepo-types`
- Implement `TaskDefinitionInfo` for `TaskDefinition` in
`turborepo-engine`
- Implement `TaskDefinitionHashInfo` for `TaskDefinition` in
`turborepo-task-hash`
- Create `TaskDefinitionExt` extension trait in `turborepo-lib` for
path/output helpers
- Create `TaskDefinitionFromProcessed` extension trait for construction
from processed definitions
- Re-export `TaskDefinition` from `task_graph` module for backward
compatibility
## Why
`TaskDefinition` is a foundational type used across multiple crates.
Moving it to `turborepo-types` allows:
1. Other crates to depend on `TaskDefinition` without depending on the
monolithic `turborepo-lib`
2. Cleaner dependency graph with reduced coupling
3. Better separation of concerns - types live in the types crate
## Testing
- All existing tests pass
- No behavioral changes for CLI users
- Backward compatible via re-exports