fix: Add fine grained interruptible task restarts in watch mode (#11135)
### Description
Fixes https://github.com/vercel/turborepo/issues/9421
This PR refactors watch mode task restarts to be "fine-grained", such
that if a package changes, only active tasks which rely on that output
get killed and restarted.
(Similar to https://github.com/vercel/turborepo/pull/10846, but taking a
slightly different approach which I think is cleaner).
### Testing Instructions
Manual testing confirms the issue is fixed with this change. There
aren't any existing automated tests for `watch` and the like, given that
it's a long running process I assume.