atproto: stream lane scheduling instead of resolving every host up front master
The shallow sweep resolved the PDS host of every unknown repo before starting a single walk -- an 8-wide barrier over the full account list, each lookup including handle verification with multi-second DNS timeouts. On a fresh index (the exact case host sharding was built for) that meant minutes of dead air before any syncing: 20k repos at 8-wide is a quarter hour of nothing but identity resolution. resolveLanes becomes feedUnresolved + laneScheduler. The scheduler keeps runLanes' guarantees -- one worker per lane, global cap, FIFO slot order so own-DID lanes still go first -- but accepts items while running. Repos whose row already names a host start walking immediately; the resolver (now 16-wide) hands the rest over one at a time as answers land. The deepen phase keeps the static runLanes: after shallow, rows have hosts. Also fixes a pre-existing data race the new test surfaced: the chat message handler's fire-and-forget streamer sync assigned the enclosing function's err from its goroutine, racing every later use of err in the handler and able to mask or fabricate its error results. It gets its own variable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>