function runProcess(executable, args, successCodes, proxyData) {
    successCodes = successCodes || [0];
    proxyData = proxyData === undefined ? true : proxyData;

    var defer = vow.defer();
    var subProcess = spawn(executable, args, {
        stdio: [0, 'pipe', 'pipe'],
        timeout: Infinity
    });
    var stderr = '';
    subProcess.stderr.on('data', function(data) { stderr += data; });

    subProcess.stdout.on('data', function(data) {
        if (proxyData) {

            // Can't use defer.notify, since to much of data trips Vow
            // defer.notify(String(data));
            passthroughProgress(String(data));
        }
    });

    subProcess.on('close', function(code) {
        if (successCodes.indexOf(code) === -1) {
            defer.reject(new Error('Command failed: ' + executable + ' ' + args.join(' ') + '\n' + stderr));
        } else {
            defer.resolve();
        }
    });

    return defer.promise();
}
Runs a process, returns promise with data notifications.

@param {String} executable
@param {String[]} args
@param {Number[]} [successCodes]
@param {Boolean} [proxyData = true] - proxy string from 'data' event?
@returns {Promise}