Refactor async matchers to share behavior