Better appframework controllers

implement most of the basic stuff that was suggested in #8290

Further Changes
* MethodAnnotationReader has been renamed to ControllerMethodReflector and will always be run before any middleware. You can inject that into your middlewares to prevent multiple expensive parsing of annotations and comments in your code
* I've adjusted the template response constructor to be easier to use
* I've deprecated all the previous methods in the controller base class since stuff is injected anyways now and for everything else theres the protected $request object. Also TemplateResponse is easier to use which should get rid of the render method
* The formatter is now choosen by the **format** parameter (does not matter what kind of request, so you can use /url/items.{format} or ?format=json. If theres no parameter it checks the first parameter in the Accept header, and if everything fails, default to json

I'll add a nice description of what exactly it does later on ;)

Usecases:

## Return JSON from a controller

```php
<?php
class JSONController extends Controller {
    public function authors () {
        return array('id' => 1, 'test' => 'hi');
    }
}
```

## Return XML from a controller

* **Route**: /my/app/authors.{format}
* **GET** /my/app/authors.xml

or

* **Route**: /my/app/authors
* **GET** /my/app/authors?format=xml OR
* **Accept**: application/xml

```php
<?php
class XMLController extends Controller {
    public function authors () {
        // response does not yet exist but if you want you can create a PR
        $this->registerResponder('xml', function($response) {
            return new XMLResponse($response);
        });
        
        return array('id' => 1, 'test' => 'hi');
    }
}
```

## Transform any data to a PHP array that can be formatted with a responder
```php
<?php
class ItemApiSerializer implements IResponseSerializer {

    public function serialize($response) {
        $result = array('items' => array());

        // wrap response in an array if its just a single item
        if(!is_array($response)) {
            $response = array($response);
        }

        foreach($response as $item) {
            $result['items'][] = $item->toApi();    
        }
    }

}

class JSONController extends Controller {
    public function authors () {
        $this->registerSerializer(new ItemApiSerializer());

        return array(new SomeClass(), new SomeClass());
    }
}
```

## Inject and cast parameters
* **GET** /my/app/authors/3?published=false
* **Route**: /my/app/authors/{authorId}

```php
<?php
class AuthorController extends Controller {
    /**
     * @param int $authorId
     * @param bool $published
     */
    public function index ($authorId, $published) {
        // return {"id":3,"published":false}
        return array('id' => $authorId, 'test' => $published);
    }
}
```