IPNetwork with strict=True rejects host addresses like 10.0.1.1/31
(host bits set). Interface IP assignments are host addresses with a
prefix length, which is exactly what IPHost accepts.
Parent relationships cannot be optional in Infrahub. Since an IP address
can exist without being assigned to an interface (reserved, planned),
we use kind: Attribute instead of kind: Parent.
Also change InfraInterface.ip_addresses from Component to Generic
since Component requires a matching Parent on the other side.
Both sides now use explicit identifier: interface__ip_addresses
for proper bidirectional linking.
InterfaceEthernet.connected_interface is a self-reference that requires
direction: outbound to avoid bidirectional conflicts per Infrahub docs.
Ref: #41