Support chord virtual features end-to-end

This is the end...

This is built on part 4. We can close the PR if people prefer, or wait until that is merged before reviewing this. Whatever people prefer.

As discussed with Mark IRL there is an optimisation to bypass the squash when there are no virtual features, but for now we'll opt for less code paths at the cost of an extra MR.

The ChordSpec is flakey, I'm just tracking one case down now, but the fix will be in the arbitraries.
Anyway to split and compose instead of the callback?