Bare Sub names that appear in 2+ modules, mapped to the list of module
names that declare them — the flat cross-module namespace can’t
disambiguate these (own-module-first/Private VBA scoping isn’t modeled),
so callers should reject the run rather than pick one silently.
Like parse, but on failure also reports where in the source the parser
gave up. Existing callers should keep using parse — this is additive,
for the --json CLI contract’s location reporting.
Resolve a bare (MySub) or qualified (Module1.MySub) entrypoint name
against modules. Callers are expected to have already rejected
cross-module bare-name collisions (see find_cross_module_sub_collisions)
before calling this — a collision-free namespace means this only ever
has two outcomes, no “ambiguous” case.