feat(circuit): add candidate assignment flow with candidateUuid and empty-km support
Introduce an end-to-end candidate assignment flow in circuit-service by switching from candidateId to candidateUuid, adding candidate-specific assignment fields, and exposing dedicated APIs for candidate assignment. Circuit-level candidate assignment now creates assignments for all matching trips (not only one), synchronizes circuit aggregation accordingly, and computes empty-km for candidate assignments through a dedicated service to keep TripDriverAssignmentServiceImpl maintainable.