Property contracts

@bsoetaer 
Implemented a bunch of contracts, and made some minor changes to the Contract module to avoid recursion when creating new matrices within a matrix contract method.

I verified that the contracts are being called through manual testing - changing one of the contracts (i.e. change '==' to '!=' in `regular_postcondition?` causes the corresponding tests to fail.

Note that 9 of the tests are currently failing, since I changed them to expect `MiniTest::Assertion` (what the `assert` methods throw on failure) rather than what was previously being thrown.  When we implement contracts for those methods, the tests will pass.  This is a test of not only our implementation, but our contracts as well.
Doesn't take into account non-square matrices which have a possibility to have a left and right inverse but if we are using the matrix library as a template this is fine. Not saying that we should include non-square matrices potential one sided inverses in this function it is just a note in case it would be considered a short-coming when we report any possible errors or un-provided functionality to the markers.