code: func (n *Node) visitDescendants(path []*Edge, cb func(*Node, []*Edge) error) error {
  	if err := cb(n, path); err != nil {
  		return err
  	}
  	for _, e := range n.children {
  		if err := e.Child.visitDescendants(append(path, e), cb); err != nil {
  			return err
  		}
  	}
  	return nil
  }
docs: // visitDescendants calls cb(n, path) and then recursively visits all
  // descendants of 'n' in depth first order until a first error.
  //
  // If a descendant is reachable through multiple paths, it is visited multiple
  // times.
  //
  // 'path' contains a path being explored now, defined as a list of visited
  // edges. The array backing this slice is mutated by 'visitDescendants', so if
  // 'cb' wants to preserve it, it needs to make a copy.
  //
  // Assumes the graph has no cycles (as verified by AddEdge).