- Extract read_locked_() to avoid holding LWIP_LOCK during socket_delay(),
which would block recv_fn() on RP2040 (needs async_context lock)
- Loop around socket_delay() for remaining time on spurious wakes from
other sockets, ensuring SO_RCVTIMEO semantics are correct
- Fix readv() to use read_locked_() directly instead of calling read(),
avoiding recursive locking and unintended socket_delay() waits