* String building code all deleted and replaced with more maintainable code
* Obscure features like metaclasses deleted
* Regular constructors used instead of factory create and parse methods
* Use Python class naming convention
* Use polymorphism more (e.g. asdict, init) for facet classes
* No more boolean any/and as users may want to test everything and not fail early
* Error state is stored instead of streamed to logger so it can be tested and more flexible formatting