1) Modelo mental: coroutine + event loop
El event loop coordina tareas cooperativas; cada `await` abre espacio para otras tareas.
Una coroutine no se ejecuta por sí sola: debe ser esperada (`await`) o programada como tarea.
`asyncio.run(...)` crea y gestiona el loop principal para scripts simples.
Si una coroutine llama funciones bloqueantes (por ejemplo `time.sleep`), se rompe la ventaja asíncrona.