add TODO: we should allow an optional message in *both* stages, preparing (when "expected" is specified) AND execution (when "actual" is specified) - with the latter, if present, overriding the former. However, this requires specialisation on the arity of the assertion.