tracer-sidecar: add pure ForkTree module + tests
ForkTreeState tracks per-host current tips and a global parent map. Edges are recorded on AddedToCurrentChain (producer's own extension always captures the true parent); SwitchedToAFork only updates the host's tip without recording an edge. clusterForkDepth = max(tip.chainLength) - commonAncestor.chainLength, where commonAncestor walks each host's ancestry back (capped at maxDepth) and intersects to find the deepest shared block. 8 hspec unit tests cover: empty state, sequential extension, agreement, 1-block fork, root-only common ancestor, deep 5-block divergence, setTip without edge, depth-cap truncation. Part of #119 — pure algebra commit; wiring + persistence in follow-up commits on this branch.