BDF improvements
- Change the semantics of the BdfList/Dictionary methods with default values so they return the default value if the value is missing, or throw an exception if it the value's present but has the wrong type - this is more useful for validators, which have to deal with optional values without accepting values of the wrong type
- Reuse BdfReader/Writer for MetadataParser/Encoder so we don't have two implementations of BDF