Cache async

Added async cache API
  - For now only the memcached adapter supports getItem[s]Async by calling Memcached::getDelayed
  - The behavior or all other async methods will be emulated by the AbstractAdapter

  - Async methods triggers:
    - *.pre event
    - *.post event
    - *.callback event for each single item

  - The callback parameter for each async method must be define as
    void callback(mixed $result, ArrayObject $info)

  - added classes:
    - CallbackEvent

  - added methods:
    - boolean Adapter::getItemAsync($key, $callback = null, array $options = array())
    - boolean Adapter::getItemsAsync(array $keys, $callback = null, array $options = array())
    - boolean Adapter::hasItemAsync($key, $callback = null, array $options = array())
    - boolean Adapter::hasItemsAsync(array $keys, $callback = null, array $options = array())
    - boolean Adapter::getMetadataAsync($key, $callback = null, array $options = array())
    - boolean Adapter::getMetadatasAsync(array $keys, $callback = null, array $options = array())
    - boolean Adapter::setItemAsync($key, $value, $callback = null, array $options = array())
    - boolean Adapter::setItemsAsync(array $keyValuePairs, $callback = null, array $options = array())
    - boolean Adapter::addItemAsync($key, $value, $callback = null, array $options = array())
    - boolean Adapter::addItemsAsync(array $keyValuePairs, $callback = null, array $options = array())
    - boolean Adapter::replaceItemAsync($key, $value, $callback = null, array $options = array())
    - boolean Adapter::replaceItemsAsync(array $keyValuePairs, $callback = null, array $options = array())
    - boolean Adapter::touchItemAsync($key, $callback = null, array $options = array())
    - boolean Adapter::touchItemsAsync(array $keys, $callback = null, array $options = array())
    - boolean Adapter::removeItemAsync($key, $callback = null, array $options = array())
    - boolean Adapter::removeItemsAsync(array $keys, $callback = null, array $options = array())
    - boolean Adapter::incrementItemAsync($key, $value, $callback = null, array $options = array())
    - boolean Adapter::incrementItemsAsync(array $keyValuePairs, $callback = null, array $options = array())
    - boolean Adapter::decrementItemAsync($key, $value, $callback = null, array $options = array())
    - boolean Adapter::decrementItemsAsync(array $keyValuePairs, $callback = null, array $options = array())
    - boolean Adapter::findAsync($callback = null, $mode = self::MATCH_ACTIVE, array $options = array())
    - boolean Adapter::clearAsync($callback = null, $mode = self::MATCH_EXPIRED, array $options = array())
    - boolean Adapter::clearAsyncByNamespace($callback = null, $mode = self::MATCH_EXPIRED, array $options = array())
    - boolean Adapter::optimizeAsync($callback, array $options = array())

  - new capabilities:
    - boolean Capabilities::getAsyncRead()
    - boolean Capabilities::getAsyncWrite()

  - TODOs:
    - add Memcached::hasItem[s]Async
    - add Memcached::getMetadata[s]Async
    - do more tests if stream_set_blocking & ext/eio could be used for the filesystem adapter to make it real async