Split the Block class into multiple smaller ones

The Block class was too big, smaller classes are cleaner. Moreover this
will allow us to refactor few things (see the next commit).
Rely on block classes, not the |kind| property

This simplifies the code on few places.
Do not store module name in Context, compute it on demand