Convert internals to use Moo and Moo compatible types

*mostly* straightforward porting. 

Not sure about the type logic exactly though.

N.B. Third Party `use` declarations performed intentionally **BEFORE** `use Moo::Role`, as this is the standard work-around to prevent `Moo::Role` treating `import()`'d subs as methods that need to be reapplied to child classes.