RFC: OrderedDict, v3, based on AbstractHashDict

__EDIT: updated title, description__

An alterate OrderedDict.  This is essentially the same version of `OrderedDict` as #2558, but without all of the copied code.  As with that version, the delete performance here is better than in #2556 (~10% overhead, vs ~50% overhead in #2556), but the code in #2556 is a bit cleaner.

_(Copied from #2558)_
If either of these move forward, I would love some specific feedback on whether to allow integer indexing for `OrderedDicts` with nonnumerical keys (e.g., `od["key"]` looks up by hashing "key", and `od[1]` returns the first (key,value) pair, but only for nonnumerical keys).  

There is also `getitem(od, 1)` for doing numerical-index based lookup, and `indexof(key)` to get the numerical index of a particular key.  Suggestions for better names for these are welcome.


__Original AbstractHashDict description__

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`).