In the quic server handle_connection, when we timed out in receiving the chunks, we loop forever to wait for the chunk. If the client never provide another chunk, the server can hopelessly wait for that chunk and wasting server resources. Instead WAIT_FOR_CHUNK_TIMEOUT_MS is introduced to bound this to 10 seconds at maximum. The stream will be dropped if it times out.
* Add new empty crates and tpu_connection_cache module
* Add BaseTpuConnection trait and impl for udp and quic
* Add ConnectionPool trait and impl for udp and quic (quic-client doesn't build)
* Add a couple quic-specific apis to QuicConfig (from ConnectionCache)
* Re-export quic- and udp-client modules to prep for move
* Move ConnectionCacheStats to new module
* Move consts
* Duplicate ConnectionCache into tpu_connection_cache (doesn't build)
* Move methods to QuicConfig and remove unneeded methods (doesn't build)
* Genericize new ConnectionCache
* Rename new struct
* Copy unit tests (tests don't build)
* Fixup unit tests
* Move quic-specific test to quic-client crate
* DRY by using ConnectionPool method
* Prevent evicting pool about to be used