docs: public synchronized WorldState next() throws Exception {
      if (this.error != null) {
        throw this.error;
      }
  
      // In case next() is called after completed with no states remaining
      if (this.complete && this.states.isEmpty()) {
        throw new IllegalStateException("No world states remaining.");
      }
      try {
        // Will block until something is available
        WorldState ws = this.states.take();
        if (ws != RESPONSE_COMPLETE) {
          return ws;
        }
      } catch (InterruptedException e) {
        // This should only happen once the request is complete
      }
  
      // If we were interrupted because of an exception, be sure to throw it
      if (this.error != null) {
        throw this.error;
      }
  
      // At this point, we should have an empty queue
      throw new IllegalStateException("Called next() on an empty StepResponse.");
    }