enhancement: comparison optimization

Optimize comparison by:

* Shortcutting when base cases are encountered
* Allowing comparison against strings (less code to write for consumers)
* Use multiple base comparators rather than the complicated/unclear version twiddle