ObjectId serialization optimizations

- ObjectId(byte[]) reads directly from array rather than wrapping in a
  ByteBuffer
- toString/fromString using fewer intermediate objects
- new ObjectId(ByteBuffer) constructor