docs: async def join(self):
          '''Wait for tasks in the group to terminate according to the wait
          policy for the group.
  
          If the join() operation itself is cancelled, all remaining
          tasks in the group are also cancelled.
  
          If a TaskGroup is used as a context manager, the join() method
          is called on context-exit.
  
          Once join() returns, no more tasks may be added to the task
          group.  Tasks can be added while join() is running.
          '''
          def errored(task):
              return not task.cancelled() and task.exception()
  
          try:
              if self._wait in (all, object):
                  while True:
                      task = await self.next_done()
                      if task is None:
                          return
                      if errored(task):
                          break
                      if self._wait is object:
                          if task.cancelled() or task.result() is not None:
                              return
              else:  # any
                  task = await self.next_done()
                  if task is None or not errored(task):
                      return
          finally:
              await self.cancel_remaining()
  
          if errored(task):
              raise task.exception()