function createProgramAsync(gl, shaders) {
  for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
    args[_key2 - 2] = arguments[_key2];
  }

  return new Promise(function (resolve, reject) {
    var programOptions = getProgramOptions.apply(void 0, args);

    programOptions.callback = function (err, program) {
      if (err) {
        reject(err);
      } else {
        resolve(program);
      }
    };

    createProgram(gl, shaders, programOptions);
  });
}
Same as createProgram but returns a promise

NOTE: There are 4 signatures for this function

    twgl.createProgramAsync(gl, [vs, fs], options);
    twgl.createProgramAsync(gl, [vs, fs], opt_errFunc);
    twgl.createProgramAsync(gl, [vs, fs], opt_attribs, opt_errFunc);
    twgl.createProgramAsync(gl, [vs, fs], opt_attribs, opt_locations, opt_errFunc);

@param {WebGLRenderingContext} gl The WebGLRenderingContext to use.
@param {WebGLShader[]|string[]} shaders The shaders to attach, or element ids for their source, or strings that contain their source
@param {module:twgl.ProgramOptions|string[]|module:twgl.ErrorCallback} [opt_attribs] Options for the program or an array of attribs names or an error callback. Locations will be assigned by index if not passed in
@param {number[]} [opt_locations|module:twgl.ErrorCallback] The locations for the. A parallel array to opt_attribs letting you assign locations or an error callback.
@param {module:twgl.ErrorCallback} [opt_errorCallback] callback for errors. By default it just prints an error to the console
       on error. If you want something else pass an callback. It's passed an error message.
@return {Promise<WebGLProgram>} The created program
@memberOf module:twgl/programs