css: improve job info page
job_info: added in obs information to html template
DB: do not allow - in column names

Used a single regular expression "valid_column" for checking column
names when preparing SQL statements dynamically.  Also test columns
separately to catch the case of a zero-length column name being
supplied.  Updated the unit test to check for private column names
being given to set_obs_info.  Created private versions of set_obs_info
and set_tilelist which take a database lock context.  These are then
called from add_job so that the info and tile list are set in the
same database context as that in which the job is added.  This is
necessary for the unit test to act as expected: otherwise jobs can
be half-inserted and then subsequent tests using the same tag will
fail due to the tag uniqueness constraint rather than the obs info
errors which are being tested.  Also added a test of the (edited)
set_obs_info and get_obs_info methods.
DB: generate dynamic namedtuples directly

There's no need to concatenate the column names.
DB: capitalize SQL in get_processing_time_obs_type
Test: basic test of get_processing_time_obs_type
DB: use state names rather than codes

The states should be referred to by name in case the codes
ever change.  Also set the desired state explicitly in
each query.
DB: fix get_processing_time_obs_type where clause

The subclauses returned by _dict_query_where_clause need to
be joined with the main where clause with an operator such
as "AND".  Enclosed each subclause in brackets in case
it contains "OR" operators.
DB: include table in _dict_query_where_clause
DB: use IN in _dict_query_where_clause when needed

Use IN expression when multiple values are provided rather
than multiple comparisons joined with OR operators.
DB: pass tuple to execute in _set_tilelist
DB: add get_tilelist method

Also add unit tests of tile list handling.
PEP8: fix violations in DB test script
PEP8: fix violations in DB module
Web: remove duplicate information on job info page
Web: remove ID numbers from job info page
Web: move job_info summary logic to template

It's really the template's job to decide how to organise the
information on the page.  Added a new "uniq" filter in order
to replicate the existing behavior.
HTML validation: correct job_info template
HTML validation: correct job_list template
HTML validation: correct error_summary template