implement hcreate_r, hdestroy_r and hsearch_r

the size and alignment of struct hsearch_data are matched to the glibc
definition for binary compatibility. the members of the structure do
not match, which should not be a problem as long as applications
correctly treat the structure as opaque.

unlike the glibc implementation, this version of hcreate_r does not
require the caller to zero-fill the structure before use.
remove struct elem entirely from hsearch.c

There are two changes here, both of which make sense to be done in a
single patch:

- Remove hash from struct elem and compute it at runtime wherever
  necessary.
- Eliminate struct elem and use ENTRY directly.

As a result we cut down on the memory usage as each element in the
hash table now contains only an ENTRY not an ENTRY + size_t for the
hash. The downside is that the hash needs to be computed at runtime.