Simplify the error messages returned by .check()

In this commit, I modified the check function so that it can *also* return a string to be used as an error message. I thought it was a much clearer way, rather than relying on `throw`, which is slow and unintuitive (imho).

The original interface hasn't changed: return `false` for the default error message (`f.toString()` *which is a bit of a wtf if you ask me*), strings can be thrown and now strings can be returned.