function _parallel(eachfn, tasks, callback) {
    callback = callback || noop;
    var results = isArrayLike(tasks) ? [] : {};

    eachfn(tasks, function (task, key, callback) {
        wrapAsync(task)(function (err, result) {
            if (arguments.length > 2) {
                result = slice(arguments, 1);
            }
            results[key] = result;
            callback(err);
        });
    }, function (err) {
        callback(err, results);
    });
}
Calls `callback` on a later loop around the event loop. In Node.js this just
calls `process.nextTick`.  In the browser it will use `setImmediate` if
available, otherwise `setTimeout(callback, 0)`, which means other higher
priority events may precede the execution of `callback`.

This is used internally for browser-compatibility purposes.

@name nextTick
@static
@memberOf module:Utils
@method
@see [async.setImmediate]{@link module:Utils.setImmediate}
@category Util
@param {Function} callback - The function to call on a later loop around
the event loop. Invoked with (args...).
@param {...*} args... - any number of additional arguments to pass to the
callback on the next tick.
@example

var call_order = [];
async.nextTick(function() {
    call_order.push('two');
    // call_order now equals ['one','two']
});
call_order.push('one');

async.setImmediate(function (a, b, c) {
    // a, b, and c equal 1, 2, and 3
}, 1, 2, 3);