Refactor region margin functions

There was no need for two separate functions for calculating region
margins in isometric and top-down modes, so managed to simplify.

Also removed the check in isometric mode to see if the region is on the
edge of the diamond, as it doesn't have to be to be closest to the edge
of the image.

Also renamed some variables to be (hopefully) more clear.
World is now rotated by default; regions are stored in world

The world's rotation is now set in measure_world; saving that until
later only adds headaches and doesn't really provide any benefit.

Region structs are now read much earlier and stored in the world struct.
This saves us some string manipulation and also lets us access the
original coordinates.
A bit of refactoring in chunk.c

Primarily, moved the light level function out of the isometric render
function. This way we could call it more than once, for example to
render moonlight shadows.

Also, it now takes a default value, so daytime shadows shouldn't appear
on top-level blocks.
Fix issue with isometric region margins
Pass more structs as pointers
Limits now work at the chunk level

Regions are passed an array of limits, and will not read any chunks
outside those limits.
unfinished: block limits

todo: finish chunk data functions

pass limits to region and chunk as nullable pointer