List Sanity tests in a config file, not a shell script

Allows parallelization of sanity tests, and better error reporting
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index ccec948..26a3fff 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -96,7 +96,7 @@
     return jobset.JobSpec(cmdline=cmdline,
                           shortname=shortname,
                           environ=actual_environ,
-                          timeout_seconds=self.timeout_multiplier * timeout_seconds,
+                          timeout_seconds=(self.timeout_multiplier * timeout_seconds if timeout_seconds else None),
                           hash_targets=hash_targets
                               if self.allow_hashing else None,
                           flake_retries=5 if args.allow_flakes else 0,
@@ -441,8 +441,10 @@
 class Sanity(object):
 
   def test_specs(self, config, args):
-    return [config.job_spec(['tools/run_tests/run_sanity.sh'], None, timeout_seconds=15*60),
-            config.job_spec(['tools/run_tests/check_sources_and_headers.py'], None)]
+    import yaml
+    with open('tools/run_tests/sanity_tests.yaml', 'r') as f:
+      return [config.job_spec([cmd], None, timeout_seconds=None, environ={'TEST': 'true'})
+              for cmd in yaml.load(f)]
 
   def pre_build_steps(self):
     return []