Example use case:
set @Builders = @($WindowsBuilder, $LinuxBuilder);
# Get Dependencies
{
    with lock = !GetSourceCode
    {
        foreach server in @Builders
        {
            with async = Git
            {
                Log-Information Get dependencies that require modifying a shared resource (like Git with a shared per-server working directory);
            }
        }
        await Git;
    }
    foreach server in @Builders
    {
        # Shared
        with async = SharedDeps
        {
            Log-Information Get dependencies that all builds need;
        }
        # Windows
        for role Windows
        {
            with async = WindowsDeps
            {
                Log-Information Get Windows-specific dependencies;
                await SharedDeps;
            }
        }
        # Linux
        for role Linux
        {
            with async = LinuxDeps
            {
                Log-Information Get Linux-specific dependencies;
                await SharedDeps;
            }
        }
    }
}
foreach server in @Builders
{
    # Windows (32-bit)
    for role Windows
    {
        with async
        {
            await WindowsDeps;
            Log-Information Build 32-bit Windows artifact;
        }
    }
    # Linux (32-bit)
    for role Linux
    {
        with async
        {
            await LinuxDeps;
            Log-Information Build 32-bit Linux artifact;
        }
    }
    # Windows (64-bit)
    for role Windows
    {
        with async
        {
            await WindowsDeps;
            Log-Information Build 64-bit Windows artifact;
        }
    }
    # Linux (64-bit)
    for role Linux
    {
        with async
        {
            await LinuxDeps;
            Log-Information Build 64-bit Linux artifact;
        }
    }
}