Improved Maze Generation

* Most important change: door capacity is no longer calculated using a
formula based on the dimensions of the room. A list of door decorators
must be passed to MazeDesigner and those decorators are used to
calculate how many doors can fit in a room. This is much better because
now decorators determine how many doors we commit to providing instead
of using a formula that does not reflect our actual building
restrictions. We can also commit to placing doors in rooms that were
previously rejected. That should increase the acceptance rate of maze
sections.
* Added a limit on the number of times that MazeDesigner can try to
create a non-empty design. That will prevent infinite loops if we ever
use a configuration that tends to fail.
* Rooms cache data on which of their walls have passages. Useful for
speeding up door placement checks and cutting down on code duplication.
* Removed several breadth-first searches from MazeDesigner and
SectionData that were used to list the nodes in a section and perform
some operations. Replaced them by passing around lists of the rooms in
each section. That cut down on duplicate code and should improve
performance a little.
* Renamed BaseDecorator to DecoratorBase and renamed DecoratorSideDoors
to DecoratorWallDoors. Added DecoratorDoors as an abstract base class
for all door decorators.
* Removed DecoratorSpreadDoors because I don't want to implement it
right now. Also removed DecoratorDefaultDoor since there are enough door
decorators and because the use of decorators has changed.
* Implemented DecoratorWallDoors and DecoratorHallwayDoor. They work
very well.
* Simplified door decorators by moving link destination setting to
DecoratorDoors. Now that's automatically handled and the code doesn't
need to be duplicated.

Known issues: It's possible that decay operations broke when design
translation was introduced. It doesn't seem that decay is being applied
anymore.
Improvements to Door Decorators

* Added a check so that DecoratorHallwayDoor does not place doors in
hallways with ceiling holes. Although unlikely, it's possible that allow
that case could conceal the exit to an area behind a door.
* Changed DecoratorWallDoors so that the two doors are placed with a gap
between them if the room is large enough. It looks better and keeps them
symmetrical regardless of room size.
* Also forgot to mention in the previous commit that I commented out the
code for building the top face of each room. It's very useful for
testing whether decorators are working properly by allowing me to look
into the maze from outside.