Core & Versioning
- Bumped package version to **2.1.4** (and internal cache subsystem version to 2.2.0).
- Added a new mandatory dependency: **msgpack ≥1.1** (used for faster, binary serialization).
Caching (treenode/cache.py)
- Completely rewrote the custom cache into a new **TreeCache** class.
- Supports both Django cache backends (if defined under “treenode”) and an in‑memory `OrderedDict` fallback.
- Introduced configurable memory limits (default 100 MB), periodic eviction, thread‑safety locks, prefix indexing, and size tracking.
- Switched from JSON + SHA‑256 hashing → msgpack + MD5 for key generation (improves speed).
- Removed legacy dependencies on `pympler`, JSON, and manual eviction logic.
QuerySet & Manager Changes
- **AdjacencyManager.get_queryset()** now orders by parent & priority only (no depth annotation) for simpler, faster SQL.
- Wrapped save/move operations in a single atomic transaction; added a guard against moving a node into its own descendant.
Model & Index Updates
- **ClosureModel**: replaced old indexes on (child, parent) with composite indexes on `(parent, depth)` and `(child, depth)` for more efficient lookups.
- Removed redundant index definitions in Adjacency models.
Mixin/API Simplifications
- Streamlined all `get_*` methods (ancestors, descendants, children, siblings, breadcrumbs):
- Dropped internal caching in favor of leaner QuerySet logic + Django ORM annotations/Subqueries.
- Unified return types to simple lists or QuerySets.
- Adjusted default `include_self` behavior (now True for siblings).
Documentation & Metadata
- Updated **README.md**: refreshed project tagline, added sponsor badge, clarified hybrid storage model description.
- Cleaned up credits section.
Breaking Changes
- Method signatures for siblings (and related include_self defaults) have changed—review your code if you relied on previous defaults.
- Legacy cache configuration keys (e.g., disabling the old TreeNodeCache) have been removed.