Я не понимаю кложный код, но судя по всему, тебе может быть интересна моя недавняя разработка - async/await на основе Free monads. У меня есь PoC, который я делал для доклада на LambdaConf.
https://github.com/graninas/zio-free(И слайды доклада, где все более-менее рассказывается:
https://docs.google.com/presentation/d/1KbKkokKY4-ndGoYC5Z_3XGbbzhrQRo_WReOhjaAHvo4/edit?usp=drivesdk)
У меня было два варианта дизайна, при одном из них синтаксиса async/await не требовалось, и скрипты были одинаковыми для синхронного и асинхронного выполнения. Я не стал проверять дальше деклараций, и не уверех, что это бы так заработало. Я пошел по дороге второго дизайна, с async/await. Здесь у меня не получилось сделать, чтобы синхронность скрипта зависела только от того, в каком окружении он запущен (в какой монаде), поэтому синхронные и асинхронные скрипты отличаются. Но всегда можно (и я это делал) запустить асинхронный скрипт на синхронное выполнение.
При Free monad подходе, учитывая природу этой монады (последовательное связывание операций), без специальной переменной Async между операциями будет зависимость по данным, и потому следующую операцию нельзя выполнить, пока не получен результат предыдущей. Async позволяет эту зависимость развязать и отложить получение результата. Конечно, там внутри лежит конкурентно мутабельная переменная, и иногда происходит перекладывание из одной такой перемнной в другую.