Implement protocol consolidation

I still need to write detailed CHANGELOG entries but basically this changes how protocols work in order to make consolidation possible. We get the following from this:

1. Improved fallbacks. A record now fallbacks to the `Tuple` implementation which then fallbacks to `Any` if no record implementation is available;

2. No need for `@only` and `@except` attributes. They were available as an optimization mechanism which is useless due to consolidation. If you are so inclined to hint the compiler, use `@prioritize` instead. With `@prioritize` you can also `@prioritize` any type (like `HashDict`) and not only the built-in ones;

3. Falling back to the `Any` implementation is now opt-in since implementing `Any` is a bad idea in the majority of the cases (more info in the `defprotocol` docs);

4. Speed, lots of speed. After the protocol is consolidated, dispatching to an existing record implementation is about 20x times faster. Dispatching to a fallback is about 1000x faster, as we don't trigger the code loading mechanisms. If you want to run the benchmark on your own, it is [available here](https://gist.github.com/josevalim/6529394df9950b19f6cb);

5. It is now easy to query if a given type implements a protocol, via the `impl_for/1` function available to every protocol;

The only thing pending for this pull request to be merged is the implementation of `mix compile.protocols` task that will consolidate all the protocols in a project.

/cc @ericmj @meh @devinus