[QUIC] AsyncDnsJob: Start connecting on partial DNS results

Make AsyncDnsJob act on each partial ServiceEndpointRequest update once
the endpoints are crypto ready. An actionable update runs the same
sequence as the final result. The job first tries IP pooling and then
feeds the connector when a usable endpoint exists. An update with
nothing usable keeps the job waiting.

The resolver produces partial updates only when its Job creates a
DnsTaskResultsManager, which was gated on kEnableIntermediateDnsResults
or Happy Eyeballs v3. kAsyncDnsQuicJob joins that gate. Without it the
job would receive nothing until the final result.

The one-shot host resolution signal now fires when the job stops being
exclusively blocked on DNS. That moment is when an attempt starts or
when the job settles from DNS without an attempt. The DNS end time is
stamped once at that moment and is not moved when the resolver finishes
later. Once an attempt started, later updates and the final resolver
result are ignored. A single in-flight attempt cannot use them, and the
attempt outcome decides the job. In particular a late resolver error no
longer fails the job. Priority updates keep reaching the resolver while
its request is in flight, which is now tracked separately from the
one-shot signal.

Completing the job synchronously from inside OnServiceEndpointsUpdated
destroys the in-flight resolver request within its own delegate
callback. The resolver implementation supports this. It dispatches
updates to each request through posted tasks with weak pointers and
invokes the delegate as its last statement, and HttpStreamPool already
resets its request from inside the same callback.

IP pooling runs on every crypto-ready update. To keep the
FindMatchingIpSessionResult metric comparable with DirectJob, which
checks pooling once, HasMatchingIpSessionForServiceEndpoint takes a
log_negative_result parameter and the job records misses only for the
first endpoints it actually checks. Existing callers keep recording
misses.

Tests drive staged partial updates with FakeServiceEndpointResolver.

Bug: 531975349
Change-Id: Iae544c44131d444689d168ef81309006fe8f09c2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/8182010
Reviewed-by: Nidhi Jaju <nidhijaju@chromium.org>
Commit-Queue: Kenichi Ishibashi <bashi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1675624}
NOKEYCHECK=True
GitOrigin-RevId: e693ee4243e1e3b28b474ee0ee1069d478ac2b48
7 files changed