Remedial commit for PR #4

If we're going to have a base provider that doesn't have default
implementations for each of its methods then we're better off using the
Abstract Base Class stuff that Python has.

Plus I removed the "Error: Invalid form" message since we should be
returning False when the login form isn't valid and we set the status
message there and then.