add [User authenticateWithEmail], including the default to create users that don`t exist. + do some refactoring