Как task groups в Swift позволяют управлять динамически создаваемыми конкурентными дочерними задачами, и какие основные различия между `withTaskGroup` и `withThrowingTaskGroup`? — ДейлиПреп