Fix some bugs with image sizing and cropping on non-square worlds

Serves me right for not testing that.
Store world regions differently

Now using a coordinate map instead of a list. This will make it easier
to find a region's neighbours.

Also replaced some structs' free() calls with macros to make it simpler
to free the members of the struct that need it.