Allow mixed sync/async context managers in `async with` statements

I see similarities to Enhance builtin iterables like list, range with async methods like __aiter__, __anext__,