Top is the top-level struct to be passed to the template.
X is the concrete type to be iterated over in the user template.
Y is the concrete type to be iterated over in the user template for each X.
Z is the concrete type to be iterated over in the user template for each Y.