commands: request reply for single get and gat when timeout_msec is set
util: generalized growable hash table for pointers
omcache_cdef.h: make 'extra' const in omcache_req_t
omcache: keep active requests in a hash table and make sure they're handled

Replaced the previous naive request / response handling implementation of
omcache_command() + omcache_io() where we're just passing around a struct
with minimum and maximum request id and hoping everything goes well with an
actual hash table of active requests.  Whenever we find a response matching
an active request or decide to offline a server all requests that were
pending will be marked as handled.

This allows omcache_io() to report proper status back to the caller.
Previously omcache_io() would keep polling if we were trying to connect to a
disabled server even if all requests were already answered, it would also
return OMCACHE_OK always after there were no more sockets to poll.  This was
incorrect, as we may end up with no sockets to poll because we had to
offline some backends because they failed asynchronously, for example in
connect or name resolution phases.
name resolution: use libasyncns for asynchronous resolution [#8]

This adds an optional (enabled by default) dependency to libasyncns to
perform asynchronous name lookups.

Note that this commit, by itself, changes the omcache_io() loop a bit and
will cause some tests to fail.  omcache_io() needs to be enhanced to not
return OMCACHE_OK if some requests were dropped.
omcache.py: refactored code to enable gevent support

Don't use the functions from commands.c which either block or require using
a response callback, but instead create the request structures in the python
code and pass them to omcache_command() and omcache_io() to allow custom
select implementation to wait on the sockets.

This allows OMcache to be used with gevent by passing gevent.select.select
to OMcache() constructor as 'select'.
tests: added check-pylint target