Implemented IEquatable<T> to speed up equality comparisons.

Actor, CPos, CVec, WAngle, WPos, WRange, WRot and WVec structs now implement IEquatable<T> which means unboxing/casting costs can be eliminated.

Also simplified the ToString method by concatenating components directly rather than using a format string since the overhead is a bit high for simple cases like this.
Added MinBy, MaxBy, MinByOrDefault and MaxByOrDefault methods and replaced calls of the style OrderBy[Descending]().First[OrDefault]() which is not as performant.
Also implemented on the Bits<T> struct.
catch trait lookup in constructor

closes #5472
move RallyPoint lookup into a Lazy
Changed logging in DoTimed/RunActivity to create less overhead.

- Refactored PerfTimer to use less memory.
- Avoid using the PerfTimer in highly called methods DoTimed and RunActivity, instead tracking long ticks manually to reduce overhead and avoid memory allocations.
- Added some helper methods in PerfTimer to output information when a tick takes too long.
- Changed PerfTimer logging to output the time at the start of the line, and no longer truncate output per line.
- Settings.LongTickThreshold changed from TimeSpan to float and renamed to LongTickThresholdMs.
Fixing issue #5308
Merge pull request #5488 from aaroncampf/bleed

Fixing issue #5308
Merge pull request #5408 from RoosterDragon/perftimer-tick

Changed logging in DoTimed/RunActivity to create less overhead
Move support power beacons into Airstrike/Nuke.

This allows each instance to close over the individual beacons. Fixes #5455.
Add clock overlay to support power beacons.
Merge pull request #5502 from pchote/support-beacons

Support beacon polish fixes.
update MapRuleStatus after download

fixes #5479
harden map search preview against invalid data

fixes #5492
calculate exitLocation before FrameEndTask

and add more null and dead checks to be safe
open-ra.org → openra.net

closes #5500
Add IReadOnlyList
Cache some dictionary lookups in FrozenUnderFog.Tick.

Since FrozenUnderFog.Tick gets called a lot, these dictionary lookups were actually getting repeated a fair amount. Avoiding the repeated work is a minor performance improvement.
Simplify MoveAdjacentTo logic. Fixes #5445.
Merge pull request #5498 from Mailaender/invalid-map-key-download

Fixed KeyNotFoundException in ServerBrowser