> having to deal with their synchronization
No such thing is typically necessary. If modeled correctly, the need for synchronization is minimal.
With sync code, tasks run fine on different threads/interpreters/processes. Message passing via queues is used to communicate which tasks need to run. Many asyncio users seem to wholly unaware of how well it works. Go-lang doesn't even have async.
I actually like asyncio; I am just not a religious zealot about it as many here seem to be without awareness of the struggles they face with loop-hogging coroutines and multicore parallelism.