1. What is the difference between launch and async coroutine builders?
Launch starts a coroutine that returns a Job immediately without blocking, used for fire-and-forget operations where you don't need a result back, like updating UI or logging. Async also starts a coroutine but returns a Deferred which is like a future or promise, and you call await on it to get the result. Use launch when you don't need a return value and just want to start background work, and async when you need to compute a value and return it. Both can be cancelled through their Job or Deferred, and both support structured concurrency. Async is useful for parallel operations where you launch multiple async coroutines and await all their results, while launch is better for side effects like database writes or analytics events where you don't wait for completion.