Added a separate class to handle caching
Tightly integrate with the main class though, so all the regular methods still work when used on a cached query
Simplified the array comparison code
We never used the alternate symbols either
Protect from large result sets filling the disk
The limit can be increased, or removed, but by default we restrict result sets to 10,000 rows
Allow the result set to be sorted without re-querying