Variable headers on standard measurement csv files

Use the fields in column 0 as a way of generating keys so we can deal
with csv files in the canonical format having varying header sizes.

Uses the same invalid-date? parsing that aliased headers do, but uses
the values in column 0 to create device/sensor maps out of the rest of
the headers.

Also:

- DRY date-parser-fn
- Fix and add tests.
- Remove measurements with no timestamp.
- Add processing status to metadata for reporting
- Fix aliases after changes to uploads

- Fix add-programmes & add-projects.

To guard against empty strings and strings that are all spaces or have
spaces.
Merge pull request #396 from MastodonC/feature/variable-length-standard-csv-header

Variable headers on standard measurement csv files
Replace sha1 with uuid.

- Allow to edit programme name.
- Allow for editing project name and property code.
- Don't analyse uuid in ES (words joined by hyphens are otherwise
  treated as 2 words)
- Update proeprties UI to allow for editing of property_code.
- Add and delete devices: Recreate sensors when unit, period or type changes.
- Add job to migrate types.
- Update routes and sensors table with sensor_id.
- Update datasets with new sensor_ids
- Return sensor_ids on device POST and update measurements API
- Update comparison page with sensor_id.
- Update generators and etl.clj.
- Don't allow duplicated names for programmes, projects and properties via UI.