This significant refactor moves course and pack scheduling away from global dates and onto per-batch semester calendars. By introducing a new BatchSemester model, every batch can now follow the same course structure on its own unique timeline, greatly increasing scheduling flexibility. Additionally, course-pack membership changes are now automatically synced into active student enrollments for improved consistency. Refactoring our scheduling architecture

Decoupled course scheduling from course packs to per-batch semester calendars - subh05sus/sparkmentis-fork