Now that we understand the foundations of coroutines, let's learn how to leverage coroutines with a view to handling async operations.
In this section, we'll explore the practical usage of coroutines in Kotlin. We'll examine the available primitives and we'll work through several examples. Finally, we'll examine some more advanced concepts, such as proper error handling and controlling coroutine scope.