docs: def descendants(self, start, generations=None):
          """
          Return the subgraph of all nodes reachable
          from the given start vertex, including that vertex.
  
          If specified, the optional `generations` argument specifies how
          many generations to limit to.
  
          """
          visited = self.vertex_set()
          visited.add(start)
          to_visit = deque([(start, 0)])
          while to_visit:
              vertex, depth = to_visit.popleft()
              if depth == generations:
                  continue
              for child in self.children(vertex):
                  if child not in visited:
                      visited.add(child)
                      to_visit.append((child, depth+1))
          return self.full_subgraph(visited)