Job graph scheduler: worker threads, dependency tracking and parallel frame execution.
Systems declare a job's dependencies when adding it to a [JobGraph];
[Scheduler::run] derives execution order from that graph rather than
the caller hand-sequencing calls, and runs independent branches (see
docs/threading-model.md's shape-of-a-frame example) across worker
threads in parallel. Current implementation is a single shared
ready-queue behind one mutex, not per-worker lock-free deques — see
"Implementation note" on [Scheduler] for why that's a deliberate
first step, not the final design.