When destroying a vnet and an epair (with one end in the vnet) we often
panicked. This was the result of the destruction of the epair, which
destroys both ends, happening while vnet_if_return() was moving the
struct ifnet to its home vnet. This can result in a freed ifnet being
re-added to the home vnet V_ifnet list. That in turn panics the next
time the ifnet is used.
Prevent this race by ensuring that vnet_if_return() cannot run at the
same time as if_detach() or epair_clone_destroy().
PR: 238870, 234985, 244703, 250870
MFC after: 2 weeks
Sponsored by: Modirum MDPay