Use associated type synonyms

The differences between the proposed patch and the `associated-type-families` branch are:

1. it defines `type StT t a :: *` and `type StM m a :: *` instead of `type StT t :: * -> *` and `type StM m :: * -> *`;
2. it does not use newtypes `StState`, `StWriter` and `StRWS`.