Implement the ability to queue a callback to xpt_async_td for later
processing. This queues a single callback that's specified at the time
of creation, rather than looked up based on topology (which is how it
differs from XPT_ASYNC). There is also no topology walk, and the
callback is responsible for all locking.
This is similar to a taskqueue, but uses the existing async thread and
provides integration with CAM by freezing the appropriate queue until
processing of the call has been completed. We accomplish this by
defining a new CCB (ccb_deferred_callback) and a new message type
(XPT_DEFERRED_CALLBACK). The old ccb_async doesn't provide a function
pointer and expanding CCB types is problematic.
Sponsored by: Netflix