code: private ReceiveMessageFuture issueFuture(int size,
                                               QueueBufferCallback<ReceiveMessageRequest, ReceiveMessageResult> callback) {
          synchronized (futures) {
              ReceiveMessageFuture theFuture = new ReceiveMessageFuture(callback, size);
              futures.addLast(theFuture);
              return theFuture;
          }
      }
docs: Creates and returns a new future object. Sleeps if the list of already-issued but as yet
  unsatisfied futures is over a throttle limit.
  
  @return never null