Having an instance available in initialize() is the newer change actually (that PR is an update to make it no longer a breaking change).
RunLaunchers have access to an instance in initialize if they want because they also control termination and you might want to terminate a run (which could require an instance) before you launch a run. The instances should always be the same (prefer the initialize one probably, at some point the one in launch_run could be removed but we'll give plenty of warning if we do)