Add DAG-based build executor for --fork mode
Instead of forking per-target (where each child independently walks
the full dependency chain), build a global DAG of unique build layers
across all solutions and execute in topological order. This ensures
shared dependencies (e.g., the compiler) are built once before their
dependents are launched, maximizing actual parallelism at each tier.
The DAG executor:
- Flattens all solutions into deduplicated build nodes keyed by hash
- Topologically sorts the global DAG
- Maintains a ready-queue of layers whose deps are all built
- Launches up to N concurrent runc containers
- Handles cache hits (pre-existing layers) without forking
- Propagates dependency failures without building
The sequential (--fork 1 / no --fork) path is unchanged.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>