Optimized ConflictPreprocessor

When a course conflicts with another, it is added to both courses' list
of conflicts. Previously, the function did not keep track of this; it
now does. If a conflict between two courses has already been added from
a previous iteration, that iteration is now skipped.