added AbstractHashDict above Dict

This generalizes most `Dict` functions to work on an abstract hash type.

Rationale: I needed an `OrderedDict` class for a project, and found no way to create one by wrapping `Dict` that was in any way efficient.  The only implementation that did not have severe performance issues was to copy almost all of `Dict` and modify it directly to keep track of the order of the keys.  The result was the near duplication of most functions.  See https://github.com/kmsquire/OrderedCollections.jl.

I'm not sure if any other `Dict` subclass will ever need this, and I don't know if an `OrderedDict` needs to be in base (it probably belongs in a `Collections` or `OrderedCollections` package).  So I'm just putting this out there to get some feedback.  

If it goes in, I have a version of `OrderedDict` on a branch which will use it (and reduce in size greatly).  If not, I'll publish the version which copies most of the `Dict` functions.

If nothing else, this patch does show the potential utility of abstract classes with fields, as most of the functions for the abstract class depend on the existence of most of the fields of `Dict` (and which were copied in `OrderedDict`).