[3.0] Abstracted Some Definition Code

Progress:

* [x] Abstract the definition storage to a dedicate class.
* [x]  Modify the definition method to return the definition and allow people to call chained setter methods on it instead of remembering the parameter order.
* [ ] ~~Add the ability to define custom constructor params.~~ don't like this

Now, when we define a definition, we store it as a Definition instance in an array, instead of being split across two arrays. This new definition class is also responsible for working out what group the model is in, and what it's actual class name is.

What this means is that we now have a really clean way to define model definitions, and we can they can be accessed and inspected/modified later. We also have the added benafit in that our users don't need to remember the parameter order anymore for the define function since they're be using chainable setters on the definition object.