Fix non-string map key issues in BSON/JSON protos.

This change:
  1. Enforces that map keys are strings.
  2. Allows a "coerce" mode in TJSONProtocol where map keys are
     coerced to strings. This is used only in the implementation
     of toString() on records, which just JSON-serialized, and must
     work on all structs, even ones with non-string-key maps.
  3. Adds various tests around this.