Introduce SchemaKey

There are two implementations:

* one for "anonymous" schemas;
* one for non anonymous schemas.

By "anonymous" it is meant schemas not loaded via URIs.

All implementations have equals()/hashCode(); anonymous schema keys are
generated via an AtomicLong's .incrementAndGet().

This means a loaded SchemaTree, even anonymous, can be identified quickly, via
its schema key and current pointer.
BaseSchemaTree: reorganize instance variables
SchemaKey: add static factory methods
BaseSchemaTree: use a SchemaKey
BaseSchemaTree: implement equals()/hashCode()

A tree is equal to another one if they have the same schema key, the same
pointer and are of the exact same class.
Dereferencing: use new SchemaKey constructors

Also make SchemaTreeEquivalence deprecated; not needed anymore.
AnonymousSchemaKey: fix brown paper bag logic bug in equals()...

if (this == obj) return true, not false!

Meh.
More documentation; modify tests to use the new API
Remove deprecated API usage in tests
Remove {project,settings}.gradle
Announce 1.2.4