Refactoring of ID ranges

This PR introduces abstracted ID ranges, which are used to assign IDs to cells. This behaviour is now seperated from the actual generation of initial conditions to allow user code to transparently interact with the generated IDs.

This is useful to extract IDs of particular cells in less intrusive ways than setting extra attributes of the cells. It also generalizes the ID generation and allows to build custom ID generation schemes that differ from the defaults.