code: final Node<E> succ(Node<E> p) {
          // TODO: should we skip deleted nodes here?
          if (p == (p = p.next))
              p = first();
          return p;
      }
docs: Returns the successor of p, or the first node if p.next has been
  linked to self, which will only be true if traversing with a
  stale pointer that is now off the list.