anchor.diff:  (define-condition remote-error (error) (type msg code))
   
   (declaim (ftype (function (rpc-connection id)
  -                          future)
  +                          blackbird:promise)
                   make-result-promise))
   (defun make-result-promise (con id)
  -  "Return a future that produces a result with an id of ID from CON."
  +  "Return a promise that produces a result with an id of ID from CON."
     (blackbird:multiple-promise-bind (result) (read-result-with-id con id)
       (mapc (lambda (w) (warn 'remote-warning
                               :msg (rpc-error-message w)
  
positive.code:   (let ((id (rpc-call-id rpc-call)))
      (if id
          (make-result-promise con id)
          ;; null id -> notification, return a trivial future.
          (values))))
  
  ;; TODO: add timeout and keepalive parameters if it seems reasonable
  (declaim (ftype (function (rpc-connection id id list &key (:notification boolean))
                            (values &optional future))
                  invoke-rpc-method))
  (defun invoke-rpc-method (con service method args &key notification)
    (let ((call (make-call-obj service method args :notification notification)))
  
negative.code: (define-condition event-loop-exited (simple-error) ())
  
  (defun wait (promise)
    "Wait for a promise to complete, then return it's value."
    (when (boundp '*rpc-batch*)
      (warn "CL-MTGNET:WAIT called with *RPC-BATCH* bound, this will probably deadlock."))
    (let ((finished nil)
  