all decode operations in the-bson produce DecodeResult, defined as
// \/ and NonEmptyList come from scalaz
type DecodeResult[+A] = \/[NonEmptyList[DecodeError], A]
if any decode operation fails, all the errors involved will be reported.
DecodeError has fixed set of subtypes: