1.1 - Frame change. When the printer is fully assembled, some of the initial threaded rods can be removed without affecting the geometry of the printer. In particular, one of the front vertices (for me the front left), so that the filament being fed to the head does not have to go under that threaded bar.
1.2 - Awaiting heads. With an X carriage capable of going to the outside of the vertical bars, and the filament able to travel the whole width of the bed unencumbered, changing head becomes almost trivial. We only need a simple "storage" module, where the waiting heads would be stored on the left of the printer, one above the other. The X carriage would be raised to the proper height to store the current working head, move to the left to clip it in the empty slot, move slightly right, then to the height of the new head, left to grab the selected head, move back to the working height (zeroing might or might not be needed) and resume printing with the new head. A simple arrangement would have N heads stacked in the possible Z height of the carriage. For a greater number of heads, we can imagine a rotating holder which would multiply the number of heads as many times as needed.
2 - Head mount. Ideally, the head mounting would feature a clip that would attach and detach without needing an external actuator. Moving the head into a slot would attach it firmly to that slot (on the X carriage for example). The position of the head on the carriage would need to achieve a precision and repeatability compatible with the precision of the printer.
2.1 - Head clip. I imagine a u-shaped clip on the carriage, with a matching u-shaped clip on the storage side. The head inside that clip forces it to have a greater width, so that the empty u-shaped clip when presented will slide between the head and the other clip, thereby grabbing the head. On retracting, the now full clip has the widest shape, and the now empty clip can shrink back to the width that will slide between the head and the departing clip.