Custom product data

Enable custom product data from the csv import/export tools. Required a good bit of refactoring from the previous style.
It used to make sense to let a product object make the row itself, but since we have to know what custom keys were on all of the products before making a row, I had to pull the actual row building out to the exporter.