Use ByRelayIds to hold guards in GuardSet
This is a prerequisite for letting bridges be guards, since in practice we will often have to identify bridges by their RSA identities briefly before we learn their Ed25519 identities.
When in doubt, I've tried to err on the side of "definitely working" over "super efficient"; we can optimize later if anything turns out to be critical path, but I doubt that it will.
I have tried to document subtlety and avoid confusion whenever possible. Feel free to give a quick "I don't get this" reaction to any parts that don't make sense right away, and I will either document or fix.