feat: update PESnapshot for 3D match storage and match_data field
Update snapshot capture to handle new 3D storage arrays:
- PESnapshot.presence now 3D: tuple[tuple[tuple[bool, ...], ...], ...]
- PESnapshot.port_store now 3D: tuple[tuple[tuple[Port | None, ...], ...], ...]
- Add PESnapshot.match_data 3D field: tuple[tuple[tuple[int | None, ...], ...], ...]
- Add PESnapshot.lane_count field to track lanes per PE
- Update capture() function to iterate through 3D arrays correctly
Verification:
- test_snapshot.py: 14 tests pass