Changed ScopingRule to deal with scala scopes

After discussion with @Lewix, we realized we had no mechanism to deal with scala-style symbol scoping, so the ScopingRule base-type now provides symbol scoping functionalities.

I also extended the optimizer macro with ClassDef and ModuleDef since some rules were throwing warnings about this.
Yeah, Scala scoping rules are not easy, but a simple scoping API can still be useful. I used the existing one for tracking [mutation inside iteration](https://github.com/dragos/scala-abide/blob/rule/iteration-mutation/rules/core/src/main/scala/com/typesafe/abide/core/MutateInsideIteration.scala) and it was really handy.

@samarion do you want to check if it's possible to handle `Block` by default, or this is the best we can do? I'd like to reach a conclusion soon and close or merge these changes, since they could affect many rules (and the PR queue is growing)