Switch to site code

Previously location importer/exporter used the doc id's for updating a location and matching to parents. This PR switches it to using the `site_code` field, which used to a required property on non-administrative locations (supply points). The field is now on all locations, no longer required (if you don't enter anything it auto generates).

This also adds the ability to do the full upload in a single pass as you can know ahead of time what the parent's `site_code` value is.

Commit history is long as it has had some back and forth in QA and a couple refactoring stages.

Has Christy's QA :heavy_check_mark: of approval.
not actionable, but for workflows like this where you have a property backed by a function i think it's a little cleaner to use a memoized property rather than do a bunch of work in the `__init__` function. will be more efficient if the property is never used, and make errors show up closer to where they really are.