Suspending functions, coroutines and deferred execution in Kotlin