- Add __post_init__ validation so Appointment rejects negative durations
- Add __repr__ to Appointment, Gap, and DayBoard for readable debugging
- Fix DayBoard.to_dict to serialize preceding_appointment_id and
following_appointment_id on Gap (were previously dropped)
- Add utilization_rate property (booked / total) with 0.0 guard