Implement "restricted" additional options

* Additional options can now be tied to only work for specific regtypes.
  For example, a training additional option can't work together with a
  single-day registration for a non-training day.
* Registration types can now require specific additional options. For
  example, a training registration can require an actual training
  additional option to be specified.
* Additional options can now be made mutually exclusive. For example,
  making it impossible to order two different training sessions that are
  held at the same time.

Fixes #669, and a number of items off last years checklist
Implement support for discount codes

This allows for creating both fixed-amount discount codes and
percentage-of-cost discount codes (either for the total cost or
for the cost of just the registration excluding additional options).

Each discount code can be limited by date availability or maximum
number of attendees using it (or of course unlimited).
Make it possible to sort rooms based on a sortkey, not just name

Can be used to make the schedule print in a "geographically relevant"
order rather than just in alphabetical.