Three additions to support interactive/notebook-style harness building:
- Graph cache invalidation: _invalidate_graph() called from all mutating
methods so svg/png output reflects latest state after mutations
- bom_list_dicts(): JSON-serializable BOM export as list of dicts
- parse(harness=, populate_bom=): append YAML fragments to existing
harness for cell-by-cell building with deferred BOM population
Templates persist on the Harness object across parse() calls so
component definitions in one fragment are available to connections
in later fragments.
Includes 24 new tests covering all three features plus full incremental
workflow simulation. All 122 tests pass.