Add database model CombinedPredictionObservation

This uses a custom SQL view written in the initial migration. The Django
model is "unmanaged" meaning it doesn't try to modify the database.

[#75795976]
Factor out parameter parsers into new lib

We do a lot of URL parsing for eg `?start=xxx&tide_level=xxx`

Originally these were only used inside the prediction app, but now they
will be used inside sea_levels too. Factor out into
api.libs.param_parsers

- New parse_tide_level function
- Move DATETIME_FORMAT into django.conf.settings
- Move exceptions out of predictions.views.exceptions
Factor out SLUG_REGEX into django settings

It was being used in 2 places, which is bad, and soon to be 3, which is
worse.
Factor out `now_rounded` and `format_datetime`

From predictions.views.helpers into api.libs.view_helpers, so it can be
used by the new sea_levels app