Add support for record and multiendian

record can be used to specify dynamic types as fields of a record or struct:

def type(arguments)
  BinData::Struct(...)
end

class A < BinData::Record
  record :field, type: type(arguments)
end

multiendian can be used to automatically duplicate a type for big and little endian

BinData::Record.multiendian(:type_name) do
  uint32 :field
end

class A < BinData::Record do
  endian :little
  type_name :field # knows to use little-endian version of type_name
end

class B < BinData::Record do
  endian :big
  type_name :field # knows to use big-endian version of type_name
end