Added more tests to ring detection.

* Fixed a couple of cases with unintended logic.
* Added edge-case tests, which currently fail.
Removed interfaces `lib.IRingPruner` and `lib.IRingValidator`.

* The above interfaces are proving to be limiting.
Refined ring detection logic substantially.

* All new tests now pass.
* Ring pruning logic needs refactoring.
Added a test for ciruclar spiro ring system.

* I am not completely sure what the real ring count should be.  For
  now, I have put `17` as the expected ring count.  Test case is
  `eight-spiro-hexanes.sdf`.
Re-formatted the entire source code.
Re-formatted source code comments across the project.
Added `core.RingSystem` as a convenience class.
Updated `lib.RingDetector` to utilise `core.RingSystem`.

* Tests continue to pass/fail as before.
Updated `core.Molecule` to store ring and ring system information.