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.