feat: update monitor snapshot, graph_json, and backend for frame-based PE state and setup_tokens
Task 1: Update monitor/snapshot.py for frame-based PE state
- Replace PESnapshot fields: matching_store/gen_counters → frames/tag_store/presence/port_store/free_frames
- Update capture() to read frame data from live PE instances
- Change SMSnapshot.t0_store type from tuple[Token, ...] to tuple[int, ...]
- Update imports: add Instruction, FrameSlotValue, Port
Task 2: Update monitor/graph_json.py for frame events and act_id
- Add imports for new event types (FrameAllocated, FrameFreed, FrameSlotWritten, TokenRejected)
- Update _serialise_node to use act_id instead of ctx
- Add _serialise_slot helper function for frame slot serialization
- Update _serialise_pe_state to show frames instead of matching_store
- Update Matched event serialization to include frame_id
- Add serialization handlers for new frame event types
- Update SM node synthesis to use act_id instead of ctx
Task 3: Update monitor/backend.py for setup_tokens injection
- In _handle_load(), inject setup_tokens before seed_tokens
- Setup tokens come from AssemblyResult (IRAM writes, ALLOC, frame slot writes)