Reuse merge code to merge inner values of container option types

In particular, this allows use of properties on individual elements of a
container type. For example, fileSystems."/" = mkMerge [ a b ]; is now
legal. Also, checking the type of the inner value is now handled by the
merge code, reducing duplication.
Add mkMap property to the module system

This allows specifying configuration that should be merged in with some
or all elements of a container option (e.g. listOf, attrsOf) without
needing to know whether those elements are actually defined elsewhere.

For example, this will default the fsType of all filesystems except
/boot to btrfs (and leaves /boot alone):

    fileSystems = mkMap (name: mkIf (name != "/boot") {
      fsType = mkDefault "btrfs";
    });

mkMap takes a function which takes an index of an element and returns a
value to be merged in with the other definitions for that element. For
sets, the index is just the attribute name. For lists, the mkMap
function is passed two arguments: The index of the relevant definition
in the list of all definitions for that option, and the index of the
element within that definition.