Cleanup and improve Struct/Array monkeypatching.

Rather than monkeypatching the builtin Struct class (kludgy), we instead define
a subclass Bud::TupleStruct; this is what we use to create the structs needed
for tuples in Bud collections. Hence we can safely monkeypatch Bud::TupleStruct
without risk of changing the semantics of other Structs used by unrelated code.

Along the way, have Bud::TupleStruct include Comparable (since we define a `<=>`
method anyway).

Note that I didn't fix a few issues. First, putting the custom equality method
of TupleStruct is inconsistent with its hashing behavior, since the latter is
defined by #hash and #eql? (which we don't override). To make this consistent,
we'd want TupleStruct#hash to match Array#hash -- but the easiest way to do that
would be to implement TupleStruct#hash as self.to_a.hash, which would have a
performance cost. I also noticed that TupleStruct#<=> is inconsistent with
TupleStruct#== (when comparing TupleStruct and Array instances); that should
probably be fixed.

Close #284.