Login v2 API

Introducing the v2 Login API, backed by the original Admin.Login logic. Builds on proposed pull request #367.
I *think* it is better go form to do:
if err != nil {
  return err
}
return nil

At least *I've* seen several people get bitten when using the "return err" style and the thing implementing Err ends up being a pointer. Because

func() error {
  var *myError = nil
  return myError
}
will return you an "error" that *isn't* 'nil' but has a value of nil. (it has a Type, so the overall interface is not nil).
I think the code is correct in this case, but given past experience it is likely better to avoid accidental "not actually nil" propagation. (Maybe I'm just paranoid).