* fix(facade): track partial-send progress in SinkReplyBuilder
SinkReplyBuilder::Send() called Write(), which hides the partial-write loop, and stamped the send
timestamp only once. On slow or throttled links a send that was still progressing looked stuck:
send_delay_seconds and send-wait-time kept growing, and --send_timeout closed live connections.
Narrow the builder's sink to util::FiberSocketBase* and drive WriteSome() directly, so every
partial write refreshes the send timestamp and moves the pending pin to the tail of pending_list,
keeping it sorted. A zero-byte write is treated as io_error, matching io::Sink::Write().
Rename ReplyStats::io_write_cnt to io_write_calls; it now counts socket write calls, and
io_write_bytes counts bytes actually written, including when a send fails midway.
Add StringSocket, a FiberSocketBase test double that replaces io::StringSink/io::NullSink (including
in ServerFamily::Replicate) and can simulate partial writes and write errors.
---------
Signed-off-by: Roman Gershman <roman@dragonflydb.io>