client: allow send_pack callers to override how packs are emitted

Sometimes, a client will already have a pack computed for the
(have, want) negotiated with the server. Rather than re-compute the
pack each time, we could instead allow the send_pack caller to handle
writing pack data themselves.

This patch leaves much of the send_pack structure intact by using
write_pack_objects as the default write strategy.