Add heterogeneousAttrsOf option type

It is parameterized by a function that takes a name and evaluates to the
option type for the attribute of that name. Together with
submoduleWithExtraArgs, this subsumes nixosSubmodule.

(cherry picked from commit 3f70dabad320b115d586a59db8cca05c7f3b7c75)

Conflicts:
	nixos/modules/virtualisation/containers.nix