Extract the MTLModel protocol

This extracts the core interface of `MTLModel` into a protocol of the same name and changes the adapters to use that instead.

This gives users of the framework a greater flexibility when integrating with existing code bases where injecting `MTLModel` into the inheritance chain may not be an option or when `MTLModel` should not be exposed as a super class. (See for example #156). For existing users, it's business as usual.

Since having a class and a protocol of the same name may be confusing, I'm all for other names for the protocol or even considering to change the name of the `MTLModel` class to break everybody's build (See #167).

This is just a proof of concept. Some of the documentation in the protocol still refers to implementation details of the `MTLModel` class implementation and should be updated accordingly.