Implemented Matrix3f#hashCode() and tested it and equals().
Revisited Vector3f#equals() and hashCode() to use Float.compare(). It
should be reasonable to expect both equals and hashcode to be different
after round-off errors (we're punting the problem of float comparison to
Java/developer), but using epsilons or deltas for comparison won't let
us satisfy the requirement that hash codes should match if two objects
are equal (there's no hashCode(float delta) to do this!).
Implemented matrix multiplication with other matrices and vectors. Added
tests for these operations.
Fixed a bug with Vector3f where re-using operators as the cache can
cause inconsistent results, e.g., vectorU.cross(vectorV, vectorU).