pw_rpc: Classes for client & bidirectional streaming

- Implement RawServerReaderWriter and derived classes. Mostly implement
  NanopbServerReaderWriter.
- Fill out MethodTraits for client/bidirectional streaming.
- Update NanopbMethodSerde argument order to match style used elsewhere
  and Google style.
- Rework MethodImplTester to reduce duplication and test new features.

Change-Id: Iaf98e925d012867bd25cb4787ab5fae52ad71f54
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/51526
Reviewed-by: Alexei Frolov <frolv@google.com>
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
diff --git a/pw_rpc/fake_channel_output.cc b/pw_rpc/fake_channel_output.cc
index e68a879..c3ee687 100644
--- a/pw_rpc/fake_channel_output.cc
+++ b/pw_rpc/fake_channel_output.cc
@@ -29,13 +29,15 @@
 
 Status FakeChannelOutput::SendAndReleaseBuffer(
     std::span<const std::byte> buffer) {
-  PW_CHECK(!done_);
   PW_CHECK_PTR_EQ(buffer.data(), packet_buffer_.data());
 
+  // If the buffer is empty, this is just releasing an unused buffer.
   if (buffer.empty()) {
     return OkStatus();
   }
 
+  PW_CHECK(!done_);
+
   Result<Packet> result = Packet::FromBuffer(buffer);
   PW_CHECK_OK(result.status());