fix: Confine prune patch paths (#13054)
## Why
Patch paths from lockfile/package manager `patchedDependencies` are
attacker-controlled repo input. `turbo prune` must not let those paths
escape the repository when reading patches or escape the prune output
when writing them.
## What
Adds source and destination confinement checks for patch files copied by
`prune`, including realpath checks for existing symlink paths and
ancestors. Non-escaping normalized paths such as
`patches/../patches/foo.patch` remain valid.
## How
Added integration coverage for an escaping patch path and a non-escaping
parent-dir path.
Verified with:
- `cargo fmt --package turborepo-lib --package turbo`
- `cargo test -p turbo --test prune_test`
Pre-push hooks also ran `format`, `check:toml`, and Rust checks
successfully.