docs: public <T> CompletableFuture<T> sendMessageWithFuture(Address dest, Buffer data, RequestOptions opts) throws Exception {
          if(dest == null)
              throw new IllegalArgumentException("message destination is null, cannot send message");
  
          if(opts == null) {
              log.warn("request options were null, using default of sync");
              opts=RequestOptions.SYNC();
          }
          rpc_stats.add(RpcStats.Type.UNICAST, dest, opts.mode() != ResponseMode.GET_NONE, 0);
  
          if(opts.mode() == ResponseMode.GET_NONE) {
              corr.sendUnicastRequest(dest, data, null, opts);
              return null;
          }
  
          // if we get here, the RPC is synchronous
          UnicastRequest<T> req=new UnicastRequest<>(corr, dest, opts);
          req.execute(data, false);
          return req;
      }