Theano matrix printing and Derivative

Two somewhat separate contributions

1.  Uses `theano.Rop` for derivatives rather than `theano.grad`.  This is more robust
2.  Adds theano translations for MatrixSlice (Subtensor) and BlockMatrix (join) 
3.  Extends `block_collapse` functionality to transposes and inverses.  
4.  Improve the application strategy for `block_collapse`. Use `bottom_up` rather than `top_down` and put in a short circuit to check for BlockMatrix elements.

As a result of 2, 3 and 4 I can execute most (all?) of Matrix expressions through Theano.  In particular I can build blocked computations (e.g. blocked cholesky) pretty smoothly.  This starts to approach the functionality in research systems for numerical linear algebra.