remove dgemm calls (replace with np.dot)

We previously used the low-level `dgemm` routine from scipy in several places. There really isn't any benefit to this, and it makes the code much harder to read. This PR just goes through and replaces all such calls with the approprate `np.dot` call. It also tidies the the `PCAMode`l constructor in a minor way in preparation for a lazy instantiation pattern in the future (we now grab the tempate at the start and use it for all subsequent initialization rather than manually getting `samples[0]` each time).