We only ever used the synchronous resolve_events_with_state_map in one place, which is trivial to replace with the async version.
We split out the actual state resolution algorithm to prepare for having multiple versions.