Add failover challenge transport: try libp2p first, fall back to HTTP
FailoverChallengeTransport wraps a primary and fallback ChallengeTransport.
On sendChallenge, tries the primary; on failure, invokes onFallback callback
and retries via fallback. Optional resolveEndpoint hook maps HTTP URLs to
multiaddrs for the libp2p transport. server.ts now uses failover when
libp2p is available.