Rewrite SyncReport for clarity and performance.

- Drop the impressive but inscrutable dynamically generated code in favour of some plain old code.
- Cache type information so costly reflection need not be performed each time.
- Only capture values from a sync object into an array rather than a dictionary lookup of both names and values for efficiency.
- Throw if the sync attribute is used on a property that cannot be read or that uses index parameters.
Use expressions to generate fast member access code rather than using the slower reflection based methods.
Add MinRange plumbing to attack activities.
Added MoveWithinRange activity for Mobile units.
Use MoveWithinRange for attack activities.

Fixes #2104. Fixes #2923. Fixes #4455.
Only inset range for mobile targets.
Simplify MoveAdjacentTo pathfinding.
Merge pull request #5617 from pchote/attack-moveadjacent

Improve unit-attack movement
Merge pull request #5616 from RoosterDragon/syncreport-simplify

Rewrite SyncReport for clarity and performance
Some minor cleanup in TraitDictionary and affected callsites.
Improve trait enumeration speed for All and GetMultiple.

Use a hand-rolled enumerators to avoid the overhead from compiler generated enumerable blocks. This trades terseness for some minor performance gains.
Merge pull request #5635 from RoosterDragon/traits

TraitDictionary cleanup
If changed settings require a restart, offer the user to do it now.

Add a dialog when closing the settings screen asking the user if they would like to restart the game now in order to apply any settings that are only applied after restarting the game. The game is reloaded in-process by spinning up a new AppDomain in order to reset state.
Restart the process rather than reloading a new AppDomain.