Limit the number of concurrent precompilations (#3396)

diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index 42b3732..b4a01a6 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -5,10 +5,12 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
+import 'dart:math';
 
 import 'package:collection/collection.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as p;
+import 'package:pool/pool.dart';
 import 'package:pub_semver/pub_semver.dart';
 import 'package:yaml/yaml.dart';
 
@@ -396,10 +398,13 @@
       } else {
         ensureDir(_snapshotPath);
       }
-      return waitAndPrintErrors(executables.map((executable) {
-        var dir = p.dirname(pathOfExecutable(executable));
-        cleanDir(dir);
-        return _precompileExecutable(executable);
+      // Don't do more than `Platform.numberOfProcessors - 1` compilations
+      // concurrently. Though at least one.
+      final pool = Pool(max(Platform.numberOfProcessors - 1, 1));
+      return waitAndPrintErrors(executables.map((executable) async {
+        await pool.withResource(() async {
+          return _precompileExecutable(executable);
+        });
       }));
     });
   }