function taskRunner(bs) {
    return function(item, cb) {
        bs.debug("-> %s", chalk.yellow("Starting Step: " + item.step));

        /**
         * Execute the current task.
         */
        item.fn(bs, executeTask);

        function executeTask(err, out) {
            /**
             * Exit early if any task returned an error.
             */
            if (err) {
                return cb(err);
            }

            /**
             * Act on return values (such as options to be set,
             * or instance properties to be set
             */
            if (out) {
                handleOut(bs, out);
            }

            bs.debug("+  %s", chalk.green("Step Complete: " + item.step));

            cb();
        }
    };
}
Run 1 setup task.
Each task is a pure function.
They can return options or instance properties to set,
but they cannot set them directly.
@param {BrowserSync} bs
@returns {Function}