perf: ~8.6x faster ESLint rule (#10943)
### Description
https://github.com/vercel/turborepo/discussions/10748 pointed out that
our ESLint rule was _wildly_ expensive. This PR improves our ESLint
rule's performance by ~8.6x in one of our large, internal monorepos.
Before: ~69.4s
After: ~8.1s
Strategies used:
- Hash-based change detection for `turbo.json`s so we only run
`project.reload()` when needed
- Introduce cache for ESLint `Project`
- Introduce cache for framework
- Introduce cache for package.json dependency detection
### Testing Instructions
- Manually checked that changing `turbo.json` and visiting an affected
file reflects changes in IDE (e.g. red squiggly disappears)
- Manually tested that diagnostics are produced/not produced as expected
- Tests continue passing
---------
Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>