Whenever a blank engine association is read from a .uproject via GetEngineIdentifierForProject(), it checks up the directory hierarchy for an engine capable of loading it via its .uprojectdirs search directories. If found, it will use that engine's local identifier from the registry, or register it if it doesn't exist.
Setting a project's engine association to an engine which is capable of loading it via it's .uprojectdirs will cause it to write a blank engine association string into the .uproject (and triggering the behaviour above on open).
#codereview Michael.Trepka
[CL 2064463 by Ben Marsh in Main branch]
* Lots of code moved into IDesktopPlatform for sharing with Launcher and Mac (including setting up file associations, querying project versions, etc...)
* Hack to enumerate all the known launcher engine installations. Does not use registry keys any more. Will probably change to use a list of installations generated by the launcher at some point soon.
* List of registered GitHub builds is stored in HKEY_CURRENT_USER
* Switching engine versions is now done through a dialog rather than through the context menu.
* VersionSelector includes a version number for shell integration, allowing it to defer to an existing installation of the same version if necessary.
#codereview Michael.Trepka
[CL 2045845 by Ben Marsh in Main branch]