Periodically refresh the match list for scouting

I've had a few instances where students thought that we didn't support
eliminations matches because they don't show up when first importing
the match list. The eliminations matches are only importable after the
alliance selections.

To work around this, the webserver now periodically imports the latest
match list. This means we don't need anyone to manually use the
"Import Match List" tab on the app anymore. I deleted that tab as
part of this patch.

The new `scouting/webserver/match_list/match_list.go` file is largely
just the code that I deleted from
`scouting/webserver/requests/requests.go`. I.e. it's really just
moving code around. The main difference now is that instead of
`requests.go` handling match list imports,
`scouting/webserver/main.go` now starts a background task to scrape
the match list every 10 minutes or so.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Ic37df45261f03a323069c1b38c4fd9682a9c4a3e
diff --git a/scouting/testing/scouting_test_servers.py b/scouting/testing/scouting_test_servers.py
index d1e4e32..40412c0 100644
--- a/scouting/testing/scouting_test_servers.py
+++ b/scouting/testing/scouting_test_servers.py
@@ -47,14 +47,15 @@
     return config
 
 
-def create_tba_config(tmpdir: Path) -> Path:
-    # Configure the scouting webserver to scrape data from our fake TBA
-    # server.
+def create_tba_config(tmpdir: Path, year: int, event_code: str) -> Path:
+    # Configure the scouting webserver to scrape data from our fake TBA server.
     config = tmpdir / "scouting_config.json"
     config.write_text(
         json.dumps({
             "api_key": "dummy_key_that_is_not_actually_used_in_this_test",
             "base_url": "http://localhost:7000",
+            "year": year,
+            "event_code": event_code,
         }))
     return config
 
@@ -72,7 +73,11 @@
 class Runner:
     """Helps manage the services we need for testing the scouting app."""
 
-    def start(self, port: int, notify_fd: int = 0):
+    def start(self,
+              port: int,
+              notify_fd: int = 0,
+              year: int = 2016,
+              event_code: str = "nytr"):
         """Starts the services needed for testing the scouting app.
 
         if notify_fd is set to a non-zero value, the string "READY" is written
@@ -83,7 +88,9 @@
         self.tmpdir.mkdir(exist_ok=True)
 
         db_config = create_db_config(self.tmpdir)
-        tba_config = create_tba_config(self.tmpdir)
+        tba_config = create_tba_config(self.tmpdir,
+                                       year=year,
+                                       event_code=event_code)
 
         # The database needs to be running and addressable before the scouting
         # webserver can start.
@@ -102,8 +109,7 @@
         ])
 
         # Create a fake TBA server to serve the static match list.
-        set_up_tba_api_dir(self.tmpdir, year=2016, event_code="nytr")
-        set_up_tba_api_dir(self.tmpdir, year=2020, event_code="fake")
+        set_up_tba_api_dir(self.tmpdir, year, event_code)
         self.fake_tba_api = subprocess.Popen(
             ["python3", "-m", "http.server", "7000"],
             cwd=self.tmpdir,