srht.FlagType: set cache_ok

Squelches a new warning from SQLAlchemy.
srht.search: fixes for sqlalchemy 1.4

See https://groups.google.com/g/sqlalchemy/c/opm2FVNKTTI/m/dVBGlD8FBAAJ
Don't inject styles for every call to markdown

These styles are already included, so it seems redundant.
Further improvements to the dark theme
Improve legibility of alert-info on dark theme
css: Add bottom margin to <pre>
Fix Blueprint name for GraphQL explorer
Fix name of srht.oauth blueprint

The latest Flask release does not support dots in Blueprint names.
Pre-style whitespace in markdown headings
use a lighter shade for magic functions
srht.Validation: return None on invalid cls
Don't trust user cookie for profile details
Fix various issues with OAuth

This was preventing user webhooks from being registered properly and
from taking effect.
Circumvent SQLAlchemy for internal auth
srht.oauth: use upsert for fetching user info

This fixes an ancient issue where, when several requests come in
quickly, one worker could insert the user details, then another worker
would trip over the constraint.
Create the metrics directory in gunicorn config
Add redis as a dependency

This is pulled in from `srht/redis.py` which comes from `service.py`
Improve recorded metrics

Summary currently doesn't expose quintile information and Histogram
records occurrence count, so the Counters are no longer necessary.
Allow enabling prometheus multiprocess mode

This requires changes to packaging to set the gunicorn config and the
'prometheus_multiproc_dir' environment variable to actually enable this
Delegate RTL direction handling to user-agents.

Check unicode RTL attrs for html content.

Reset global text-align.