Kotlin Coroutine's structured concurrency. Cancelling a parent automatically cancels child jobs, unless explicitly handled not to. https://kotlinlang.org/docs/coroutines-basics.html

Stupidly, child cancellation cancels the parent scope as well, unless the scope opts out by including SupervisorJob.