Added struct Range and struct ReverseRange.

The Range and ReverseRange structs hold [begin, end) and [top, bottom) ranges
of dungeon coordinates.  Added helper functions makeRange() and
makeReverseRange(), conversion functions makeRangeFromReverseRange() and
makeReverseRangeFromRange() and convenience functions expandRange() and
expandReverseRange().

Changed struct TileStatistics to use xRange and yRange members instead of
minX, maxX, minY and maxY.

Modified graphDungeonLevelUsingText() and supporting static functions to
use Range and ReverseRange.
Changed declared order of members of struct Tiles.

Added member names to struct Tiles initializer in Tiles.c.
Encapsulated count member of struct Tiles.

Added tilesCount() function to encapsulate access to .count struct member.
Encapsulated capacity member of struct Tiles.

Added tilesCapacity() function to get value of capacity member of a Tiles
struct.
Encapsulated access to tiles member of struct Tiles.

Added allTiles() function to retrive pointer tiles array.
Tiles structs are now mainly heap allocated.

Added createTiles() and destroyTiles() functions for dynamically allocating
Tiles structs.  Made initializeTiles() and finalizeTiles() static functions.

Changed tiles member of struct Dungeon to a pointer and removed #include for
Tiles.h from Dungeon.h.

Added mallocOrDie() function and MALLOC_OR_DIE() macro to heap.h/heap.c.
Updated header guards in heap.h.

Changed TilesTest.c to use a struct Tiles pointer instead of a local variable.
Made struct Tiles an opaque data structure.

Changed signature of tilesOnLevel() to return a dynamically allocated
struct Tiles * instead of a struct Tiles const.  Modified function
graphDungeonLevelUsingText() and tests in TilesTest.c to destroy the
returned Tiles pointers.

Moved definition of struct Tiles from Tiles.h into Tiles.c.
Removed function tilesCapacity() from Tiles.h/Tiles.c.

Also removed uses of tilesCapacity() from tests in TilesTest.c.
Added function tileInTilesAtIndex().

Removed function allTiles() and replaced uses with tileInTilesAtIndex().
Changed Tiles collection to use an array of pointers internally.

Changed struct Tile objects to all be dynamically allocated.  Added
createTile() and destroyTile() functions.

Renamed tilesOnLevel() to createTilesOnLevel() so that it's clear the returned
struct Tiles * needs to be destroyed.

Changed struct Tiles member tiles to be a struct Tile **.  Changed supporting
Tiles functions to work with the array of struct Tile pointers.

Added parent member to struct Tiles for tracking the source of Tiles subsets.
Changed addTileToTiles() and removeTileFromTiles() to also add or remove the
given tile to/from the parent.

Changed finalizeTiles() to destroy all struct Tile pointers if the Tiles
struct has no parent.

Modified addNewEmptyTileToDungeonAt() to call createTile().

Added makePoint() convenience function for struct Point.

In Range.c, changed makeRange() and makeReverseRange() to use designated
initializers.
Extracted find() and sort() static functions in Tiles.c.

Extracted find() helper function to isolate bsearch() call.
Extracted sort() helper function to isolate qsort() call.
Added compare member to struct Tiles.

The compare member holds the comparison function pointer for sorting and
searching.  Currently it's always set to compareTilesByCoordinate().