code: @Override
      public Optional<E> next() {
          if (iterator.hasNext()) {
              return Optional.of(iterator.next());
          }
          return Optional.empty();
      }
docs: calling next over the boundary of the contained iterator leads
  Optional.empty indefinitely "no matter how many times you try, you can't
  shoot the dog"
  
  @return Optional yielding next element if present, Optional.empty() otherwise