In preparation for multiple-display support, the existing view controller is
decoupled from UTMVirtualMachine and UTMSpiceIO and now interfaces solely
with VMDisplayViewControllerDelegate. This allows us to then wrap the VC into
a UIViewControllerRepresentable and isolate much of the state into
VMWindowState (a single window) and VMSessionState (entire VM). Finally, the
loading screens are re-implemented in SwiftUI.
With the new toolbar that is always visible, there is no value in
storing the legacy toolbar visibility in the per-VM viewState setting.
Now, legacy toolbar VMs will always start with the toolbar visible. With
that removed, we also remove the per-VM keyboard visibility setting to
be a global value (the keyboard visibility for the last VM launched will
persist). This also simplifies the code for the delegate and the VM
manager.
Additionally expose APIs for Swift 5.5 concurrency support (currently
unused). This should simplify the handling of various interdependent
events that must come together for startVM and other operations. It also
opens the door for future async handling of VM operations when better
support for Cocoa, UIKit, and SwiftUI comes.