Могу привести кстати в пример эволюцию асинков в C#
2010 год, C#4, появилось понятие асинхронный задач как объектов. Поддержки компилятора нет
2012, C#5, появились ключевые слова async, await, абстракция awaitable. Встроенный генератор конечного автомата, но есть возможность реализации своего.
2016, .net core, в ms наконец-то упоролись быстродействием, появилась альтернативная стандартная специализированная реализация задач с упором на ликвидацию аллокаций. Поддержки компилятора не требовалось.
Полученная абстракция в связке со встроенными языковыми средствами позволили делать поистине упоротые удобные вещи типа такого:
https://devblogs.microsoft.com/pfxteam/await-anything/