bootp/arp/rarp/rpc all use the sendrecv implementation in net.c. tftp has its own implementation because it passes an extra parameter into the recv callback for the received payload type to be held.
These sendrecv implementations are otherwise equivalent, so consolidate them. The other users of sendrecv won't be using the extra argument to recv, but this gives us only one place to worry about respecting timeouts and one consistent timeout behavior.
As an aside, it's not obvious to me why receives don't respect MAXTMO in sendrecv. I guess it's assumed that we'll hit a connection error before we hit MAXTMO, but I'm not sure if we want to count on this.