Types

Adds a basic type checking module to enforce types in a coherent way.
I opted not to use a external module for this because I didn't find one that was similar enough to what I wanted, without adding boiler plate code everywhere.

Open to that idea though if it exists already, as I'm not a huge fan of having this included.

**edit:** Note, this doesn't add or remove any type checking that wasn't already being done with `assert`.
I think the readability trade off isn't an issue as this is encapsulated and (ideally) easily tested code, and therefore the more performant solutions are beneficial as we don't know what the use cases for our users are?