perf(db): batch aggregated_cache writes in save_as_system_process

save_as_system_process now issues one bulk UPDATE for all supply-node
aggregated_cache writes instead of one roundtrip per node. New
update_node_prop_bulk (UPDATE ... FROM unnest) handles both append
modes; text[]+::jsonb cast avoids asyncpg list-collapse ambiguity.

The required_matching half was implemented then reverted — deferring
that DB write made a pre-existing flaky test timing-sensitive (A/B at
N=10 confirmed the aggregated_cache-only change is flake-neutral:
baseline 3/10, change 4/10). required_matching batching tracked
separately for its own investigation.

Validation: two_origins CO2=1.2568, subrecipe CO2=0.0930,
120/121 broad gauntlet (1 pre-existing flake, A/B-confirmed unaffected).