public.json: Require drop.exclusivity and .geo

It looks like unprivileged users should see:

* Everything about open and semi-open drops.
* Nothing about closed drops.

There was some debate about whether drop.id should be visible for
semi-open drops, since the drop ID is all you need to add yourself to
a drop.  Possible setups:

a. Don't set drop.id when telling unauthorized users about semi-open
   drops.
  + We don't leak the drop ID.
  - There's no stable identifier for unauthorized users to reference
    that drop.
b. Add stricter permission checks for adding yourself to a drop, even
   if the requester knows the drop ID.
  + We can freely publish the drop ID.
  - It's more complicated for users to authorize each other (they
    currently just have to share drop numbers).
c. Publish the drop.id freely, but don't display it in our web UI.
  + Same authorization scheme we currently have.
  - Users who read the API specs or poke around in their JavaScript
    can find drop IDs for semi-open drops and add themselves to drops
    they aren't cleared for.

On IRC today, Jordan said we should go with (c) for now.

Benjamin and Jordan also explicitly ok-ed showing the next delivery
date for semi-open drops, so we can freely publish drop.routes (since
the route endpoints are currently completely public).
public.json: Add drop.fees and a dropFees schema

The new website UI needs these to display while folks are looking for
drops to join or viewing information about a particular drop.
Internally, we keep these as references to strings, but to make the
API more flexible, we're boiling that down to two enumerated
attributes:

a. When do you have to pay a fee (drop.fees.condition)?
   1. Whenever you order on that drop (order).
   2. Whenever someone holds your order for you (held).
   3. Never (null).
b. How do you pay the fee (drop.fees.medium)?
   1. You don't have to pay any fees (null).
   2. With volunteer time (volunteer).
   3. With money (payment).

Here's how our internal strings will be rendered:

* No, this is a community drop.
  -> {"medium": null, "condition": null}
* No, but tips are welcome.
  -> {"medium": "payment", "condition": null}
* No, but volunteering to help is necessary.
  -> {"medium": "volunteer", "condition": "order"}
* Yes, for all orders.
  -> {"medium": "payment", "condition": "order"}
* Yes, but only if I have to hold orders.
  -> {"medium": "payment", "condition": "hold"}

but other combinations may occur in the future.  For example:

* {"medium": "volunteer", "condition": "hold"}
  -> "You have to volunteer if I hold an order for you."
* {"medium": "volunteer", "condition": null}
  -> "Volunteers welcome!"