Extends first object passed in with all other object passed in after.
First param could be a boolean indicating whether or not to perform a deep extend.
Last param could also be a boolean indicating whether to use legacy setters if they are available
on the receiving object.

@example (if last param to passed in to `sjl.extend` is `true`
var o = {setGreeting: v => this.greeting = 'Hello ' + v},
otherObject = {greeting: 'Junior'};
// Calls o.setGreeting when merging otherObject because `true` was passed in
// as the last parameter
sjl.extend(o, otherObject, true);

@function module:sjl.extend
@arg `0`    {Object|Boolean} - If boolean, causes `extend` to perform a deep extend.  Optional.
@arg `1-*`  {Object} - Objects to merge on @arg 0.
@arg `last` {Boolean} - Optional.
@returns    {Object|null} - Returns first object passed in or null if no values were passed in.
function extendMulti () {
        var args = argsToArray(arguments),
            deep = extractBoolFromArrayStart(args),
            arg0 = args.shift();

        // Extend object `0` with other objects
        args.forEach(function (arg) {
            // Extend `arg0` if `arg` is an object
            if (isObject(arg)) {
                extend(arg0, arg, deep);
            }
        });

        return arg0;
    }