implement a more involved form of metaclass compat fixing

This is basically an extension of the algorithm used in Moose.
Basically, if two metaclasses are incompatible but only because of
modifications to separate parts of the metaclass, we can just "merge"
the classes together to get one that works while also satisfying
metaclass compatibility.

This is just a rough draft so far, although it does work for basic
cases. We may still be able to make it more intelligent by looking at
individual cases that result in conflicts and determining what the
correct behavior is in those cases.

I think that overall, the Observables system will mean that this will
come up a lot less often than it does in Moose, but it's good to have
the ability.