Feature/oauth retry

Changes canvas SDK calls to raise NewTokenNeeded exception on unauthorized error which will prompt the oauth middleware to begin the token dance anew.

Updates tests.
One minor point here that I think I mentioned in person at our last meeting.  The "reason"s uniquely correspond to status codes, but according to the w3 spec they can be localized.  I think it would be safer and cleaner to just check for the code of 401 here.