Add choices to custom data fields

Waiting on QA
@twymer
It's a tradeoff between external interface and internal implementation complexity. The new `CustomDataField` has a more complicated interface (there is an `init` method to call after instantiating the object). The cost of maintaining the old/simpler interface is a more complicated implementation (conditionally doing the init step if an argument is present). My feeling is that simple interfaces are more valuable than simple implementations, but I can see why you may feel differently. It's up to you if you want to change it. I don't feel too strongly.