Move property processing, type checking, and merge code into a function

This makes the relationship between property types clearer, and more
importantly will let option types parameterized by other option types
reuse the code for delegated type checking and merging.
types.listOf: Use mergeDefinitions to handle each element

This simplifies typechecking and allows properties to be used inside the lists
types.attrsOf: Use mergeDefinitions to handle each element

This simplifes typechecking and allows properties to be used inside of
the attribute sets.

This fixes the empty synergy-client and synergy-server services
previously generated on systems with synergy disabled.