equals() for TokenDetails is broken
Following is how `equals` has been implemented for `TokenDetails`

```
 @Override
   public boolean equals(Object obj) {
            TokenDetails details = (TokenDetails)obj;
            return equalNullableStrings(this.token, details.token) &
                    equalNullableStrings(this.capability, details.capability) &
                    equalNullableStrings(this.clientId, details.clientId) &
                    (this.issued == details.issued) &
                    (this.expires == details.expires);
        }    
```
This implementation doesn't take into account when obj is null or not the type of token details.

**Expected**
Return false when obj is null or a different type

Spotted:
Flutter plugin Stream writer does this check when writing types to streams
```
protected void writeValue(@NonNull ByteArrayOutputStream stream, @Nullable Object value) {
    if (value == null || value.equals(null)) {
      stream.write(NULL);
```
diff --git a/lib/src/main/java/io/ably/lib/rest/Auth.java b/lib/src/main/java/io/ably/lib/rest/Auth.java
index e1c068b6..dc3fa9fc 100644
--- a/lib/src/main/java/io/ably/lib/rest/Auth.java
+++ b/lib/src/main/java/io/ably/lib/rest/Auth.java
@@ -6,6 +6,7 @@ import java.security.GeneralSecurityException;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
@@ -358,6 +359,8 @@ public class Auth {
          */
         @Override
         public boolean equals(Object obj) {
+            if (!(obj instanceof TokenDetails)) return false;
+
             TokenDetails details = (TokenDetails)obj;
             return equalNullableStrings(this.token, details.token) &
                     equalNullableStrings(this.capability, details.capability) &
@@ -366,7 +369,12 @@ public class Auth {
                     (this.expires == details.expires);
         }
 
-}
+        @Override
+        public int hashCode() {
+            return Objects.hash(token, capability, clientId, issued, expires);
+        }
+
+    }
 
     /**
      * Defines the properties of an Ably Token.
['lib/src/main/java/io/ably/lib/rest/Auth.java']