Code review fixes for the #432 loop-pin-labels feature:
- Fix loop rendering to use port indices instead of pin numbers
(pre-existing bug: non-sequential pins produced wrong diagram)
- Add duplicate label check to the ambiguity branch in resolve_pin()
- Prevent self-referencing loops (pin looped to itself)
- Fix activate_pin() type annotation to accept Optional[Side]
- Deduplicate pin resolution: Harness.connect() now delegates to
Connector.resolve_pin() instead of reimplementing the logic
- Add 21-test suite covering all resolution paths and error modes