call asio recv functions only after our handlers are dispatched

unfortunately, asio seems to violate its own documentation and *does*
call handlers from async_* functions. restarting our receives after our
handlers have run mitigates this somewhat, but sync receive will still
be broken if packets arrive back to back.