If it does the latter, the stack will keep growing with each nested wait call:
main -> runEventLoop -> someCallback -> wait_all -> runEventLoop -> anotherCallback -> wait_all -> ...
The async/await transformation to a state machine avoids this problem.