[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
C traverses across columns the fastest so I think you might have intended to write:

return ((i, j) for j in range(cols) for i in range(rows))

(which is actually what you put in the Fortran case and which I think should be exchanged for what you have here)
Or have I gotten it wrong?