Rather than using taskqueue_swi_giant which holds Giant for all
deferred destroy_dev calls, instead lock Giant explicitly around the
caller-supplied callback passed to destroy_dev_sched_cb only when
D_NEEDGIANT is set.
In addition, switch to taskqueue_thread for destroy_dev_sched.
Deferred destroy_dev requests don't need to run at an SWI priority.