Abstract out the MoQ Chat User interface and implement E2E chat test.

Separate the Constructor for ChatClient() and the Connect() call.

ChatClient now takes a generic ChatUserInterface to send output and collect input however the owning application specifies.

PiperOrigin-RevId: 665344318
diff --git a/build/source_list.json b/build/source_list.json
index 079ba76..94ad682 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1559,6 +1559,7 @@
     "quiche/quic/moqt/tools/chat_client_bin.cc",
     "quiche/quic/moqt/tools/chat_server.cc",
     "quiche/quic/moqt/tools/chat_server_bin.cc",
+    "quiche/quic/moqt/tools/moq_chat_end_to_end_test.cc",
     "quiche/quic/moqt/tools/moq_chat_test.cc",
     "quiche/quic/moqt/tools/moqt_client.cc",
     "quiche/quic/moqt/tools/moqt_end_to_end_test.cc",