[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
Yeah, I'm really happy about this. You can also do Piecewise inline in a matrix element definition using the ternary operators, so you don't even have to apply `piecewise_fold`. I'm seeing all sorts of uses for this, mainly in the evaluation of a linearized system matrix where the choice of independent/dependent coordinates is the conditional (dealing with the singularities). Would help with stability analysis throughout an entire range of motion.