Rewrite

This is a substantial change set from the original library.

Major changes include removing multiple submodules in favour of a single module. The intent behind this change was to promote better code re-use by working within a single file and iteratively building on existing code. This has proved fairly successful and the core feature set from the original package has been replicated in far fewer lines of code.

Also included are updates to the docs and tests to match the changes in code.