function superExtend(dest, source) {
            if (_.isArray(dest)) {
                if (!source) {
                    return dest;
                }
                var removals = {};
                var newArray = [];
                var el, i;
                for (i = 0; i < dest.length; i++) {
                    el = dest[i];
                    if (_.isString(el) && el[0] === "!") {
                        removals[el.substring(1)] = true;
                    } else {
                        newArray.push(el);
                    }
                }
                for (i = 0; i < source.length; i++) {
                    el = source[i];
                    if (_.isString(el) && el[0] === "!") {
                        var idx = newArray.indexOf(el.substring(1));
                        if (idx !== -1) {
                            // Remove from newArray
                            newArray.splice(idx, 1);
                        }
                    } else if (newArray.indexOf(el) === -1 && !removals[el]) {
                        newArray.push(el);
                    }
                }
                return newArray;
            } else if (_.isObject(dest)) {
                dest = _.extend({}, dest); // shallow clone
                if (source) {
                    for (var p in source) {
                        if (source.hasOwnProperty(p)) {
                            if (dest[p] === undefined) {
                                dest[p] = source[p];
                            } else {
                                dest[p] = superExtend(dest[p], source[p]);
                            }
                        }
                    }
                }
                return dest;
            } else {
                return dest !== undefined ? dest : source;
            }
        }
This is a super-charged version of _.extend, it recursively merges
objects and concatenates arrays (but does not add duplicates).
If an array contains a string element starting with "!" that element (without !)
will be removed from the merged array if present.

This function does not modify either dest or source, it creates a new
object