Throws a type error if value is not of type and prepends the prefix and
paramName/variable-name to the message (removes type checking boilerplate where required).
@function module:sjl.throwTypeErrorIfNotOfType
@param prefix {String} - Context name and function name to prefix to error message if it is thrown.
@param paramName {String} - Param name of the value being passed in.
@param value {*} - Value to inspect.
@param type {String|Function} - Expected type constructor or constructor name.
@param [suffix] {String|*} - A hint to user or a way to fix the error;  Message to suffix to error message.  Optional.
@throws {TypeError}
@returns {void}
function throwTypeErrorIfNotOfType (prefix, paramName, value, type, suffix) {
        var classOfValue = classOf(value);

        // If `type` itself is not of the allowed types throw an error
        if (!isString(type) && !isFunction(type)) {
            throw new TypeError('`sjl.throwTypeErrorIfNotOfType` only accepts strings or constructors.  ' +
                'Type received: `' + classOf(type) + '`.');
        }

        // Proceed with type check
        if (!classOfIs(value, type)) {
            throw new TypeError('#`' + prefix + '`.`' + paramName
                + '` is not of type "' + type + '".  ' + (suffix || '')
                + '  Type received: `' + classOfValue + '`.');
        }
    }