Added sign in guards.

Sign in guards provide you with fine-grained control over the process of
signing in a user. Each guard is run in order and will hand the session
off to the next guard in the process. Any guard may also choose to fail
the sign in process and provide a message explaining why. Additionally
you could immediately determine the sign in process was a success and
skip running additional guards.