[WIP] - Code Printing refactor, matrix support

** Edit **
This started out as just adding support for `Matrix` in codeprinting/codegen, but turned into a fairly substantial refactor of the existing codebase. I have updated this to reflect that. The TODO list is a trimmed down version of the original TODO, `autowrap` support should come in a later PR, this only has to do with printing now.

See my mammoth sized comment below for what's inside this PR now
** end edit **

TODO:
- [x] Support for matrix output in ccode and CCodeGen
- [x] Support for matrix output in fcode and FCodeGen
- [x] Support for `MatrixSymbol` input in ccode and CCodeGen
- [x] Support for `MatrixSymbol` input in fcode and FCodeGen
- [x] Tests
Seems a little odd to use the standard as a integer, as it more a label (string) for different Fortran versions. But this is fine I suppose. I can't think of reasons it would need to be otherwise.