getaddrinfo(3) is a blocking syscall with no async variant on the
platforms flare targets. :func:resolve_async runs it on a fresh pool
thread (the pthread mechanism :func:block_in_pool uses) and waits
for that thread: the caller is blocked for the whole lookup, exactly
as with :func:flare.dns.resolve. What it adds is a separate stack and
a :class:Cancel check before the lookup starts and after it returns.
It does not free a reactor thread to serve other connections while the
lookup runs, and a cancel that arrives mid-lookup takes effect only
when getaddrinfo returns. Errors come back with the resolver's
message (DnsError(host): reason) as a plain Error, which is
what a raised DnsError is by the time any caller sees it.
:func:order_happy_eyeballs reorders a resolved address list into the
RFC 8305 connection-attempt order (interleave IPv6 / IPv4, starting with
the family of the first address) so a dialer can race families without one
stalling the other.
The worker thread is joined (the public API is synchronous --
the submitter waits for the result anyway), so a flipped cancel is
honored at the pre-flight and post-flight boundaries, the same contract
as block_in_pool. A truly fire-and-forget resolve that returns the
reactor to its loop while the lookup runs would need reactor-side
completion wiring (eventfd/pipe wakeup) instead.