Make the I/O part of QUICHE compile under Bazel.

This renames those targets from epoll_* to io_*, since those are no longer epoll-dependent.

I got those to compile on Linux under the Clang opt build, and almost all of the tests passed.

PiperOrigin-RevId: 476972652
diff --git a/build/test.bzl b/build/test.bzl
index 9beb0ca..33bef08 100644
--- a/build/test.bzl
+++ b/build/test.bzl
@@ -1,5 +1,6 @@
 """Tools for building QUICHE tests."""
 
+load("@bazel_skylib//lib:dicts.bzl", "dicts")
 load("@bazel_skylib//lib:paths.bzl", "paths")
 
 def test_suite_from_source_list(name, srcs, **kwargs):
@@ -17,10 +18,13 @@
         if not sourcefile.endswith("_test.cc"):
             fail("All source files passed to test_suite_from_source_list() must end with _test.cc")
         test_name, _ = paths.split_extension(paths.basename(sourcefile))
+        extra_kwargs = {}
+        if test_name == "end_to_end_test":
+            extra_kwargs["shard_count"] = 16
         native.cc_test(
             name = test_name,
             srcs = [sourcefile],
-            **kwargs
+            **dicts.add(kwargs, extra_kwargs)
         )
         tests.append(test_name)
     native.test_suite(name = name, tests = tests)