will be asserted
if a string, we will use it as the error message, if it is a function, we will call it to produce the error message (can be used to avoid costly message generations)
GuardError - if the assertion fails
will be asserted