Stricter validation in Message#initialize for non-existent fields

My colleagues and I noticed that `Message#initialize` and `Message.encode` silently drop fields that aren't actually part of the proto. This PR makes the validation explicit, and throws a `Protobuf::FieldNotDefinedError` in that situation.

Alternatively, we could introduce backwards compatible `#initialize!` and `.encode!`. However, I think it would be a big win for this gem to enforce the schema of the protobuf to this extent.

Please take a look, and thanks for all your work for this Gem!

cc @tamird
My first reaction is to remove the `unless value.nil?` modifier, though my gut tells me that is guarding against something undesirable. I would say remove it and see how the tests fare. What I don't want to have happen is having multiple setter code paths (one in `[]=` and one in the initializer).