psycopg3 could not determine the type of bare bind params inside CASE WHEN
... IS NULL expressions in _UPSERT_SQL. Wrap geom_json as CAST(:geom_json AS text)
and bbox coords as CAST(:bbox_xmin AS double precision) so Postgres has an explicit
type hint in both branches.
Also fixes pre-existing test breakage: QuarterDump gained required field
`opportunity` in a prior PR; added opportunity={} to all 3 inline QuarterDump
constructors in test_nspd_sync.py. Adds 2 regression tests for _upsert_dump
(null-geom path and real-geom path) to catch re-introduction.