pw_transfer: Rewrite to use event model

This updates the design of the pw_transfer C++ code to run via a series
of events dispatched to a dedicated transfer thread. This removes any
transfer processing from RPC callback contexts, preventing RPC-servicing
threads from blocking on expensive transfer operations.

Additionally, system timers are no longer used for timeouts, as the
potential to run in an interrupt context precludes effective handling of
timeout operations. Instead, timeouts are managed by the transfer thread
checking to see if any of its transfers have timed out every time it
runs.

Change-Id: I28b858f1918c3f3a9e126564d3426a296519a5cc
Requires: pigweed-internal:22480
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/82883
Reviewed-by: Keir Mierle <keir@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/pw_transfer/test_rpc_server.cc b/pw_transfer/test_rpc_server.cc
index 6b595e0..7b08272 100644
--- a/pw_transfer/test_rpc_server.cc
+++ b/pw_transfer/test_rpc_server.cc
@@ -32,7 +32,6 @@
 #include "pw_thread_stl/options.h"
 #include "pw_transfer/transfer.h"
 #include "pw_transfer_test/test_server.raw_rpc.pb.h"
-#include "pw_work_queue/work_queue.h"
 
 namespace pw::transfer {
 namespace {
@@ -117,10 +116,10 @@
 constexpr size_t kChunkSizeBytes = 256;
 constexpr size_t kMaxReceiveSizeBytes = 1024;
 
-work_queue::WorkQueueWithBuffer<10> work_queue_;
-
-TransferServiceBuffer<kChunkSizeBytes> transfer_service(work_queue_,
-                                                        kMaxReceiveSizeBytes);
+std::array<std::byte, kChunkSizeBytes> chunk_buffer;
+std::array<std::byte, kChunkSizeBytes> encode_buffer;
+transfer::Thread<4, 4> transfer_thread(chunk_buffer, encode_buffer);
+TransferService transfer_service(transfer_thread, kMaxReceiveSizeBytes);
 TestServerService test_server_service(transfer_service);
 
 void RunServer(int socket_port, const char* directory) {
@@ -133,7 +132,7 @@
   rpc::system_server::Server().RegisterService(test_server_service);
   rpc::system_server::Server().RegisterService(transfer_service);
 
-  thread::DetachedThread(thread::stl::Options(), work_queue_);
+  thread::DetachedThread(thread::stl::Options(), transfer_thread);
 
   PW_LOG_INFO("Starting pw_rpc server");
   PW_CHECK_OK(rpc::system_server::Start());