Improve contracts for Dict

1. Functions like merge/2 and equal?/2 are only polymorphic in the
Dict module. Implementations of the Dict module only need to
care about equality and merging of the same types.

2. take/2, drop/2 and split/2 accept any Enum as argument.