Add (sparse) structs to Fact thrift format

a) I don't think it adds anything in this case - sometimes it can be useful to document things - but in this case I don't think so.
b) I would generally split this into a a few smaller properties - this is possibly personal preference - but it makes them a lot easier to understand the property they are actually testing and a lot easier to change:
 - all keys in input maps appear in output maps
 - all keys in output appear in one of input maps (this is a given except scala)
 - all values from left map are in output.values.map(_.a).flatten
 - all values from right map are in output.values.map(_.b).flatten