Automatically log in users who access third party login after trying to register for a course

This PR refactors `change_enrollment` and `enroll` so that `change_enrollment` handles only validation we'd expect in a view ("is the user logged in before trying to access this view", "is this user in the auto-register A/B test", etc), and the `enroll` method handles more "server"-y concerns (is the class already full, does the class exist, etc).

That way, the third party login flow can simply call `enroll` directly without worrying about skipping over any important checks, since we don't really have access to views midway through the third party login flow.
So, the unit tests that are failing seem to be failing largely because a lot of unit tests are in enrolling students in courses that don't actually exist (e.g. modulestore().get_course(foo) returns None).  It seems to me that checking for the existence of a course in the modulestore is the correct behavior—is that correct?  If so, would simply mocking the get_course function be the best way to handle this in unit tests, or is there a better way?