Refactoring ApiListener to be more generic

### Action configuration

Each CrudAction now got API specific configuration under the `api` config key

Each action can configure the API behavior for 'success' or 'error' behavior, based on the events emitted from the action.

The configuration options are:

```
(array)  api.methods	     - list of http verbs allowed for this action when in API mode
(int)    api.success.code    - the http response code used for 'success' API responses
(array)  api.success.data    - a list of key/value pairs to extract data from subject or raw
(int)    api.error.code	     - the http response code used for 'error' API responses
(string) api.error.exception - exception class to use for errors
(array)  api.error.data	     - a list of key/value pairs to extract data from subject or raw
```

### Special error.exception config

If you set 'error.exception.type' to 'validate' a special 'CrudValidationException' class will be used, that contain all the validation errors from the request, both the local model, and the models relations.

### Example of 'data' usage:

```php
// extract 'id' from $subject and put it into array($modelClass => array('id' => $id));
array('subject' => array('{modelClass}.id' => 'id'))

// set array($modelClass => array('id' => 10));
array('raw' => array('{modelClass}.id' => 10));
```

### Consistent events

`_redirect` and `beforeRender` event subjects now contain much more consistent state
properties, and will be identical to the one from the 'after*' event

### Dynamic detectors

It's now possible to configure the `detectors` in the API listener

The valid detector keys are:

- `ext`:        For CakeRequest->params['ext'] comparison with this value
- `accepts`: For CakeRequest::accepts() comparison

JSON and XML is configured by default already as before.

All the detectors configured in the listener, will also be grouped into an `api` detector

```php
// Configure detector 'json' to respond to /posts.json and request type application/json
$this
   ->Crud
   ->listener('api')
      ->config('detectors.json', array('ext' => 'json', 'accepts' => 'application/json'));
```

Keep in mind, if these detectors are changed, you need to call `setupDetectors()` again, which is now public :)