Fix error handling for the packaging script (#15351)

This fixes the error handling for the packaging script so that it will properly report a failure exit code when it can't find the executable that it's looking for.

Added a test too.
diff --git a/dev/bots/test/prepare_package_test.dart b/dev/bots/test/prepare_package_test.dart
index f9c18fe..c460e7b 100644
--- a/dev/bots/test/prepare_package_test.dart
+++ b/dev/bots/test/prepare_package_test.dart
@@ -17,6 +17,24 @@
 
 void main() {
   final String testRef = 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
+  test('Throws on missing executable', () async {
+    // Uses a *real* process manager, since we want to know what happens if
+    // it can't find an executable.
+    final ProcessRunner processRunner = new ProcessRunner(subprocessOutput: false);
+    expect(
+        expectAsync1((List<String> commandLine) async {
+          return processRunner.runProcess(commandLine);
+        })(<String>['this_executable_better_not_exist_2857632534321']),
+        throwsA(const isInstanceOf<ProcessRunnerException>()));
+    try {
+      await processRunner.runProcess(<String>['this_executable_better_not_exist_2857632534321']);
+    } on ProcessRunnerException catch (e) {
+      expect(
+        e.message,
+        contains('Invalid argument(s): Cannot find executable for this_executable_better_not_exist_2857632534321.'),
+      );
+    }
+  });
   for (String platformName in <String>['macos', 'linux', 'windows']) {
     final FakePlatform platform = new FakePlatform(
       operatingSystem: platformName,