code: protected Future<?> callOnMessages(final List<? extends Message> messages) throws IllegalStateException {
  		if(isClosed()) throw new IllegalStateException("Socket is closed");
  		if(messages.isEmpty()) throw new IllegalArgumentException("messages may not be empty");
  		return listenerManager.enqueueEvent(
  			new ConcurrentListenerManager.Event<SocketListener>() {
  				@Override
  				public Runnable createCall(final SocketListener listener) {
  					return new Runnable() {
  						@Override
  						public void run() {
  							listener.onMessages(
  								AbstractSocket.this,
  								messages
  							);
  						}
  					};
  				}
  			}
  		);
  	}
docs: When one or more new messages have arrived, call this to distribute to all of the listeners.
  If need to wait until all of the listeners have handled the messages, can call Future.get()
  or Future.isDone().
  
  @throws  IllegalStateException  if this socket is closed