callback is just: function(err) if err, action should be abandoned & error is propogated no data is allowed to be changed by the function
function verifyIntent(subject, op, target, data, cb) {
  var type = (_.isString(target)) ? target : target.type;
  var listeners = listenersFor(op, type);
  if (listeners.length === 0) { return cb(); }
  if (data && data.uuid) { delete(data.uuid); } // uuid is immutable, so don't include - even if it's in the data
  var intent = new Intent(subject, op, target, data);
  async.each(listeners,
    function(listener, callback) {
      try {
        listener(intent, callback);
      } catch (err) {
        cb(err);
      }
    },
    function(err) {
      cb(err, target);
    }
  );
}