Custom product data

Enable custom product data from the csv import/export tools. Required a good bit of refactoring from the previous style.
This could be simplified to `for k, v in val.items():` since you know `val` is a dict.