Added maps for tiles for better accessibility

The actor and staticElement field of level are now maps from identifiers to the
actual data. This gives a level the ability to identify a tile by its id.

I also added a coordinate to list of identifier map. This allows to get all
tiles that locates at a specific coordinate.
added fromString, which creates a level from a string

The fromString function takes also a TileBuilder, which translates
individual chars from the level string to either actors or static
elements.

I extracted the functionality of getting the next free id from
createTask into its own function. The function freshID returns the next
free id and increments the appropriate field in the level type.
added toString, which renders a level to a string

The function has to know the boundaries of the level, so I added a field
to the level type to store this information. The toString function
basically maps over a two dimensional list of coordinates, pulls the
tiles at this position out of the level and renders the top most to a
char.
Resolve some suggestions from hlint

No logic changes, just remove some redundant brackets and swapped
`catMaybes $ map ...' with mapMaybe as suggested.
Merge branch 'level-creation' into develop