Enhance auto indent logic

This improves the current auto indent strategies, with exception of the horrible `ScalaAutoIndentStrategy`, which requires so heavy changes that I can't do them at the moment.

For `ScalaAutoIndentStrategy` there is the problem that it relies on code from JDT (but which is mainly unused). Rebasing it to the token stream of scalariform and its formatter preferences requires time, nothing I can do at the moment.

This PR is large, but it contains a lot of tests and the logic changes are relatively unrelated to other components. For more information to a single commit, see the commit messages.