the Gen.choose is purely to get the right typing out of it at the far side.

Needs heavy testing to check these, cause lots of false failures. Any changes to this portion of the logic i'd rather do in another PR. These are a bit of a minefield of transient failures to do with reference equality issue mentioned above