Added user and authentication usage to readme
diff --git a/README.md b/README.md
index c16bd7e..e7af07d 100644
--- a/README.md
+++ b/README.md
@@ -75,17 +75,17 @@
 
 When making any RESTful call, a `type` parameter (or `path`) is always required. Whether you specify this as an argument or in an object as a parameter is up to you.
 
-### GET
+### GET()
 
 **GET entities in a collection**
 
-    Usergrid.GET('collection', function(err, usergridResponse, entities) {
+    Usergrid.GET('collection', function(error, usergridResponse, entities) {
         // entities is an array of UsergridEntity objects
     })
     
 **GET a specific entity in a collection by uuid or name**
 
-    Usergrid.GET('collection', '<uuid-or-name>', function(err, usergridResponse, entity) {
+    Usergrid.GET('collection', '<uuid-or-name>', function(error, usergridResponse, entity) {
         // entity, if found, is a UsergridEntity object
     })
     
@@ -102,11 +102,11 @@
     // this will build out the following query:
     // select * where weight > 2.4 and color contains 'bl*' and not color = 'blue' or color = 'orange'
     
-    Usergrid.GET(query, function(err, usergridResponse) {
+    Usergrid.GET(query, function(error, usergridResponse) {
         // entities is an array of UsergridEntity objects matching the specified query
     })
     
-### POST and PUT
+### POST() and PUT()
 
 POST and PUT requests both require a JSON body payload. You can pass either a standard JavaScript object or a `UsergridEntity` instance. While the former works in principle, best practise is to use a `UsergridEntity` wherever practical. When an entity has a uuid or name property and already exists on the server, use a PUT request to update it. If it does not, use POST to create it.
 
@@ -126,7 +126,7 @@
         cuisine: 'pizza'
     }
     
-    Usergrid.POST(entity, function(err, usergridResponse, entity) {
+    Usergrid.POST(entity, function(error, usergridResponse, entity) {
         // entity should now have a uuid property and be created
     })
     
@@ -145,7 +145,7 @@
 	    })
     ]
     
-    Usergrid.POST(entities, function(err, usergridResponse, entities) {
+    Usergrid.POST(entities, function(error, usergridResponse, entities) {
         //
     })
     
@@ -157,9 +157,9 @@
         cuisine: 'pizza'
     })
     
-    Usergrid.POST(entity, function(err, usergridResponse, entity) {
+    Usergrid.POST(entity, function(error, usergridResponse, entity) {
         entity.owner = 'Mia Carrara'
-        Usergrid.PUT(entity, function(err, usergridResponse, entity) {
+        Usergrid.PUT(entity, function(error, usergridResponse, entity) {
             // entity now has the property 'owner'
         })
     })
@@ -172,7 +172,7 @@
     // this will build out the following query:
     // select * where cuisine = 'italian'
     
-    Usergrid.PUT(query, { keywords: ['pasta'] }, function(err, usergridResponse) {
+    Usergrid.PUT(query, { keywords: ['pasta'] }, function(error, usergridResponse) {
         /* the first 10 entities matching this query criteria will be updated:
            e.g.:
            [
@@ -196,13 +196,13 @@
         /*
     })
     
-### DELETE
+### DELETE()
 
 DELETE requests require either a specific entity or a `UsergridQuery` object to be passed as an argument.
     
 **DELETE a specific entity in a collection by uuid or name**
 
-    Usergrid.DELETE('collection', '<uuid-or-name>', function(err, usergridResponse) {
+    Usergrid.DELETE('collection', '<uuid-or-name>', function(error, usergridResponse) {
         // if successful, entity will now be deleted
     })
     
@@ -216,32 +216,163 @@
     // this will build out the following query:
     // select * where color = 'black' or color = 'white'
     
-    Usergrid.DELETE(query, function(err, usergridResponse) {
+    Usergrid.DELETE(query, function(error, usergridResponse) {
         // the first 10 entities matching this query criteria will be deleted
     })
 
 ## Entity operations and convenience methods
 
-`UsergridEntity` has a number of helper/convenience methods to make working with entities more convenient.
+`UsergridEntity` has a number of helper/convenience methods to make working with entities more convenient. If you are _not_ utilizing the `Usergrid` shared instance, you must pass an instance of `UsergridClient` as the first argument to any of these helper methods.
 
-### reload
+### reload()
 
-    entity.reload(function(err, usergridResponse) {
+    entity.reload(function(error, usergridResponse) {
         // entity is now reloaded from the server
     })
     
-### save
+### save()
 
     entity.aNewProperty = 'A new value'
-    entity.save(function(err, usergridResponse) {
+    entity.save(function(error, usergridResponse) {
         // entity is now updated on the server
     })
     
-### remove
+### remove()
 
-    entity.remove(function(err, usergridResponse) {
+    entity.remove(function(error, usergridResponse) {
         // entity is now deleted on the server and the local instance should be destroyed
     })
+    
+## Authentication, current user, and auth-fallback
+
+### appAuth and authenticateApp()
+
+`Usergrid` can use the app client ID and secret that were passed upon initialization and automatically retrieve an app-level token for these credentials.
+
+    Usergrid.setAppAuth('<client-id>', '<client-secret>')
+    Usergrid.authenticateApp(function(error, usergridResponse, token) {
+        // Usergrid.appAuth is created automatically when this call is successful
+    })
+    
+### authFallback
+
+Auth-fallback defines what the client should do when a user token is not present. By default, `Usergrid.authFallback` is set to `UsergridAuth.AUTH_FALLBACK_NONE`, whereby when a token is *not* present, an API call will be performed unauthenticated. If instead `Usergrid.authFallback` is set to `UsergridAuth.AUTH_FALLBACK_APP`, the API call will instead be performed using client credentials, _if_ they're available (i.e. `authenticateApp()` was performed at some point). 
+
+### usingAuth()
+
+At times it is desireable to have complete, granular control over the authentication context of an API call. To facilitate this, the passthrough function `.usingAuth()` allows you to pre-define the auth context of the next API call.
+
+    // assume Usergrid.authFallback = UsergridAuth.AUTH_FALLBACK_NONE
+    
+    Usergrid.usingAuth(Usergrid.appAuth).POST('roles/guest/permissions', {
+        permission: "get,post,put,delete:/**"
+    }, function(error, usergridResponse) {
+        // here we've temporarily used the client credentials to modify permissions
+        // subsequent calls will not use this auth context
+    })
+
+### currentUser and authenticateUser()
+
+`Usergrid` has a special `currentUser` property. By default, when calling `authenticateUser()`, `.currentUser` will be set to this user if the authentication flow is successful.
+
+    Usergrid.authenticateUser({
+        username: '<username>',
+        email: '<email-address>', // either username or email is required
+        password: '<password>'
+    }, function(error, usergridResponse, token) {
+        // Usergrid.currentUser is set to the authenticated user and the token is stored within that context
+    })
+    
+If you want to utilize authenticateUser without setting as the current user, simply pass a `false` boolean value as the second parameter:
+
+    Usergrid.authenticateUser({
+        username: '<username>',
+        email: '<email-address>', // either username or email is required
+        password: '<password>'
+    }, false, function(error, usergridResponse, token) {
+    
+    })
+    
+## User operations and convenience methods
+
+`UsergridUser` has a number of helper/convenience methods to make working with user entities more convenient. If you are _not_ utilizing the `Usergrid` shared instance, you must pass an instance of `UsergridClient` as the first argument to any of these helper methods.
+    
+### create()
+
+Creating a new user:
+
+    var user = new UsergridUser({
+        username: 'username',
+        password: 'password'
+    })
+    
+    user.create(function(error, usergridResponse, user) {
+        // user has now been created and should have a valid uuid
+    })
+    
+### login()
+
+A simpler means of retrieving a user-level token:
+
+    var user = new UsergridUser({
+        username: 'username',
+        password: 'password'
+    })
+    
+    user.login(function(error, usergridResponse, token) {
+        // user is now logged in
+    })
+
+### logout()
+
+Logs out the selected user. You can also use this convenience method on `Usergrid.currentUser`.
+
+    user.logout(function(error, usergridResponse) {
+        // user is now logged out
+    })
+    
+### logoutAllSessions()
+
+Logs out all sessions for the selected user and destroys all active tokens. You can also use this convenience method on `Usergrid.currentUser`.
+
+    user.logoutAllSessions(function(error, usergridResponse) {
+        // user is now logged out from everywhere
+    })
+    
+### resetPassword()
+
+Resets the password for the selected user.
+
+    user.resetPassword({
+        oldPassword: '2cool4u',
+        newPassword: 'correct-horse-battery-staple',
+    }, function(error, response, success) {
+        // if it was done correctly, the new password will be changed
+        // 'success' is a boolean value that indicates whether it was changed successfully
+    })
+    
+### UsergridUser.CheckAvailable()
+
+This is a class (static) method that allows you to check whether a username or email address is available or not.
+
+    UsergridUser.CheckAvailable(client, {
+        email: 'email'
+    }, function(err, response, exists) {
+       // 'exists' is a boolean value that indicates whether a user already exists
+    })
+    
+    UsergridUser.CheckAvailable(client, {
+        username: 'username'
+    }, function(err, response, exists) {
+       
+    })
+    
+    UsergridUser.CheckAvailable(client, {
+        email: 'email',
+        username: 'username', // checks both email and username
+    }, function(err, response, exists) {
+        // 'exists' returns true if either username or email exist
+    })
 
 ## UsergridResponse object
 
@@ -251,7 +382,7 @@
 
 You can check `usergridResponse.ok`, a `bool` value, to see if the response was successful. Any status code < 400 returns true.
 
-    Usergrid.GET('collection', function(err, usergridResponse, entities) {
+    Usergrid.GET('collection', function(error, usergridResponse, entities) {
         if (usergridResponse.ok) {
             // woo!
         }
@@ -269,7 +400,7 @@
 
 Examples:
 
-    Usergrid.GET('collection', function(err, usergridResponse, entities) {
+    Usergrid.GET('collection', function(error, usergridResponse, entities) {
         // third param is an array of entities because no specific entity was referenced
         // you can also access:
         //     usergridResponse.entities
@@ -278,7 +409,7 @@
         //     usergridResponse.last		 
     })
     
-    Usergrid.GET('collection', '<uuid or name>', function(err, usergridResponse, entity) {
+    Usergrid.GET('collection', '<uuid or name>', function(error, usergridResponse, entity) {
         // third param is a single entity object
         // you can also access:
         //     usergridResponse.entity
@@ -286,7 +417,7 @@
         //     usergridResponse.last                
     })
     
-    Usergrid.GET('users', function(err, usergridResponse, users) {
+    Usergrid.GET('users', function(error, usergridResponse, users) {
         // third param is an array of users because no specific user was referenced
         // you can also access:
         //     usergridResponse.users
@@ -294,7 +425,7 @@
         //     usergridResponse.last 
     })
     
-    Usergrid.GET('users', '<uuid, username, or email>', function(err, usergridResponse, user) {
+    Usergrid.GET('users', '<uuid, username, or email>', function(error, usergridResponse, user) {
         // third param is a single user object
         // you can also access:
         //     usergridResponse.user
@@ -308,7 +439,7 @@
 
 **Create a connection between two entities**
 
-    Usergrid.connect(entity1, 'relationship', entity2, function(err, usergridResponse) {
+    Usergrid.connect(entity1, 'relationship', entity2, function(error, usergridResponse) {
         // entity1 now has an outbound connection to entity2
     })
     
@@ -316,14 +447,14 @@
 
 **Retrieve outbound connections**
 
-    client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, 'relationship', function(err, usergridResponse, entities) {
+    client.getConnections(UsergridClient.Connections.DIRECTION_OUT, entity1, 'relationship', function(error, usergridResponse, entities) {
         // entities is an array of entities that entity1 is connected to via 'relationship'
         // in this case, we'll see entity2 in the array
     })
     
 **Retrieve inbound connections**
 
-    client.getConnections(UsergridClient.Connections.DIRECTION_IN, entity2, 'relationship', function(err, usergridResponse, entities) {
+    client.getConnections(UsergridClient.Connections.DIRECTION_IN, entity2, 'relationship', function(error, usergridResponse, entities) {
         // entities is an array of entities that connect to entity2 via 'relationship'
         // in this case, we'll see entity1 in the array
     })
@@ -332,7 +463,7 @@
 
 **Delete a connection between two entities**
 
-    Usergrid.disconnect(entity1, 'relationship', entity2, function(err, usergridResponse) {
+    Usergrid.disconnect(entity1, 'relationship', entity2, function(error, usergridResponse) {
         // entity1's outbound connection to entity2 has been destroyed
     })
     
@@ -345,7 +476,7 @@
 **Loading a file system image via `fs.readFile()`**
 
     var asset = new UsergridAsset('myImage')
-    fs.readFile(_dirname + '/image.jpg', function(err, data) {
+    fs.readFile(_dirname + '/image.jpg', function(error, data) {
         asset.data = data
     })
     
@@ -364,7 +495,7 @@
 
     var asset = new UsergridAsset('myImage')
     fs.createReadStream(_dirname + '/image.jpg').pipe(asset).on('finish', function() {
-        client.POST('collection', asset, function(err, assetResponse, entityWithAsset) {
+        client.POST('collection', asset, function(error, assetResponse, entityWithAsset) {
             // asset is now uploaded to Usergrid
         })
     })
@@ -375,7 +506,7 @@
     fs.createReadStream(_dirname + '/image.jpg').pipe(asset).on('finish', function() {
         // assume entity already exists; attach it to the entity:
         entity.attachAsset(asset)
-        client.PUT(entity, asset, function(err, assetResponse, entityWithAsset) {
+        client.PUT(entity, asset, function(error, assetResponse, entityWithAsset) {
             // asset is now uploaded to Usergrid
         })
     })
@@ -388,13 +519,13 @@
     fs.createReadStream(_dirname + '/image.jpg').pipe(asset).on('finish', function() {
         // assume entity already exists; attach it to the entity:
         entity.attachAsset(asset)
-        entity.uploadAsset(function(err, assetResponse, entityWithAsset) {
+        entity.uploadAsset(function(error, assetResponse, entityWithAsset) {
             // asset is now uploaded to Usergrid
         })
     })
     
 **entity.downloadAsset() allows you to download a binary asset**
 
-    entity.uploadAsset(function(err, assetResponse, entityWithAsset) {
+    entity.uploadAsset(function(error, assetResponse, entityWithAsset) {
         // access the asset via entityWithAsset.asset
     })