Type configs

This is a modest restructuring that makes all of a JsonObject subclass's type inferences configurable. It's done like this

```python
class MyJsonObject(JsonObject):
    class Meta(object):
        # this replaces the default DateTimeProperty with your custom one
        # you can also completely override all properties from scratch with
        # properties = {...}
        update_properties = {datetime.datetime: MyBetterDateTimeProperty}
```

Now, in a `MyJsonObject` subclass, you'll still be able to have `DateTimeProperty`s, but in the case of a dynamic property (one that you didn't specify in the schema) it will now default to using `MyBetterDateTimeProperty`.

Oh, no wait sorry. `convert` is the (possibly user-specified) function for transforming a string to a python type (like a `datetime` or a `Decimal`), so nothing to do with regexes. I think the idea is that the regex might match a string, but that string isn't actually a valid input. The right thing is for there to be a contract where that function raises a specific error if the input isn't right. Seems like something I can do separately so I made this issue: https://github.com/dimagi/jsonobject/issues/98