async function callAsyncParallelHook (container, hook, args) {
    // hooks may return promises.
    // all hooks are executed at the same time without waiting
    // will wait for all hooks to complete before returning
    let hookResults = [];
    let plugins = _getSortedPlugins(container.__plugins, hook);
    let previous = [];

    for (let i = 0; i < plugins.length; i++) {
        if (typeof plugins[i].execute[hook] === 'object' && plugins[i].execute[hook].sequential) {
            let values = await Promise.all(previous);
            hookResults.push(...values);
            previous = [];
            let v = await _callAsyncHook(plugins[i], hook, args);
            hookResults.push(v);
            continue;
        }

        previous.push(_callAsyncHook(plugins[i], hook, args));
    }

    let values = await Promise.all(previous);
    hookResults.push(...values);
    return hookResults;
}
@param {PluginContainer} container 
@param {string} hook 
@param {any[]} args 
@return {Promise}