Add .shouldBlock() and .isRateLimited(); normalise .isBlocked()

I wonder if this would be clearer if we separated the two conditions.  Currently it's a bit weird because "isBlocked" and "isEmailAction" don't really have anything to do with each other.  Perhaps we could have e.g.:

    if (this.isBlocked()) {
        // The user has been explicitly blocked
    }
    if (isEmailAction(action)) {
        // Apply rate-limiting to email-sending actions.
    }
    // Other cases are allowed through.
    return 0