Refactor after realization the Array, Hash, and Set being setup wrong

Earlier I was working thinking that Array.Hash.Set were being used as a
parallel to Attribute, when actually those should be used as the
instance values of a collection, and that we needed Collection as a
class to be parallel to Attribute.

With that new understanding, I changed Collectable back to Collection,
and have been building that class up to do it's job.  Followed the lead
of Attribute and so have no specs yet, though there isn't anything very
complicated in that class.

Hash is the first of the collections that I've started to flesh out. the
type_cast method shoul be factored out into a Collections::Base class
which we can also use to set the interface with the always popular
NotImplementedError.  The key_method works well for providing a unique
value to use for the key of the hash.

There seems to be a use case for some functionality around attempting to
add_elements.  Both in raising errors when a key is used again
(redefining a value) and when a value can't be coerced into the correct
type.

If i wanted to add the ability to ignore values that can't be cast, I'd
put in a ignore_type_error option check and add in a catch clause to
catch TypeErrors then continue instead of reraiseing.

If I wanted to add the ability to raise errors when reusing a key, I'd
add a raise_on_duplicate option, and put in a check on the key value
before the new value is assigned.

There are a few gotcha's with the way DelegateClass works, and so I have
kind_of? overridden, but I'm not sure that's needed.  I'm sure when I
implement Array and Set it'll become clear what needs to be done.

While all specs are passing, this commit is not complete by itself.