utils: add `ndenumerate` utility function
utils:

More consistent doc string formatting.
tests/utils_test:

Added 1d, 3d, and 4d test cases for `nrml.utils.ndenumerate`.
hazard/writers:

Renamed `_validate_hc_hm_metadata` to `_validate_hazard_metadata`;
it's used for hazard curves, hazard maps, and disaggregation, so I think
this warrants a more generic name.
hazard/writers:

Factored out some common logic for setting metadata attributes of
container elements in hazard curve and hazard map serialization.

Disaggregation will use this same logic as well. So this saves a lot
of duplication.
schema/hazard/disaggregation.xsd:

Added missing `tectonicRegionTypes` attr to matrix container.
schema/hazard/disaggregation.xsd:

Relaxed the types of bin edge definition to allow for some flexibility.

In XSD, there's no obvious way to model a comma separated list (by default,
lists are whitespace separated).
examples/disaggregation.xml:

Updated example file to match the style that the XML writer will
follow.
hazard/writers:

Renamed _OPT_KW_TO_ATTR_MAP to _ATTR_MAP, then renamed _set_optional_metadata
to _set_metadata and changed the parameter to make it more generic.
hazard/writers:

Added missing docstring to `_set_metadata`.
hazard/writers:

Added missing 'lon' and 'lat' to _ATTR_MAP.
hazard/writers:

Removed extra blank lines.
hazard/writers:

Added implementation of DisaggXMLWriter.
tests/hazard/writers_test:

Updated hazard curve and hazard map writer tests to use the new
constructor signature, and updated expected results accordingly.
tests/hazard/writers_test:

Added 2 serialization test cases for DisaggXMLWriter.
tests/hazard/writers_test:

All serialization tests now validate the produced XML as well.
tests/hazard/writers_test:

Fixed XML validation in the serialization tests (there was no
assertion!!) and removed an invalid disaggregation serialization case.
hazard/writers:

Corrected an invalid attribute name (s/depths/depth/).
tests/hazard/writers_test:

Updated tests corresponding to the SESXMLWriter attribute fix.
run_tests: script output has better paths