Refactor scanner

Currently, the compiler performs some scanning – the Scanner returns the content of components pretty much unmodified, in raw form.

This PR moves the responsibility for splitting components into their syntactic elements into the Scanner. This is a cleaner separation that will more easily allow for new component types.
An alternative to messing around with the name and identifier would be to return four values rather than three, with the extra one being a boolean indicating whether the block is conditional. This can be done later, if deemed necessary.