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.
I think there are two ways you could handle this:

1) Update the tests to create courses using `CourseFactory`.  Since the tests aren't expecting the course to have any particular properties (except maybe that it's open for enrollment), this should be relatively easy.

2) Add a kwarg to `enroll()` that explicitly enables the access check, and default it to `False` (except where you need it to be `True`).

Although it's less "clean", I'd prefer (2).  It's entirely possible that other parts of the system rely on creating enrollments for users before a course is available for registration.  Making this check "opt-in" will avoid accidentally breaking things.

I'm particularly worried about some of our non-standard enrollment flows, like invitations to edge courses, beta testers, adding a user as course staff, etc.  If we make the new check opt-in, we can avoid having to test all those different paths.