#696: sites maps a (consumer, target) edge to the project-relative
identity_path and span of the consumes clause that declares it. When a
cycle is detected the diagnostic is anchored on its closing edge’s clause (a
real span in a real file) so the CLI renders ariadne source context; an edge
absent from sites (e.g. a synthetic adapter’s) yields an unattributed,
spanless diagnostic as before.
v0.12: detect cycles in the provider dependency graph. Each provided
capability depends (via its provider’s given) on other capabilities; a
cycle means the composition root cannot order instantiation. Emits
bynk.provider.dependency_cycle on every provider that participates in a
cycle. providers is keyed by capability name.