View Cells for #3052

Here is a proposal implementing [View Cells](https://github.com/cakephp/cakephp/issues/3052). There still a few things to do yet, so please consider this as a preview. Let me know what you think :)

***

Conventions:

- Cell classes name must end with `Cell` word. e.g.: TagCloudCell.php
- Cell classes belongs to `View` namespace.
- Must extend the abstract class `\Cake\View\Cell`
- And implement the `render()` method.
- Cell's template must be located in `Template/Cell/` directory
- Default template name = underscored name of the class (without "Cell" suffix) e.g.: `tag_cloud` for TagCloudCell class (You can set your own template name at Cell::$template)
- Cell classes are able to use Helpers and Tables. (Cell::$helpers & Cell::loadModel())

Example:

    // App/View/LatestNews.php
    namespace App\View\Cell;

    class LatestNews extends \Cake\View\Cell {
       public function render(array $options = []) {
          $limit = empty($options['limit']) ? 5 : $options['limit'];
          $category = empty($options['category'])  ? [] : ['category' => $options['category']];
          $this->loadModel('News');
          $this->set('news',
              $this->News->find()
                  ->where($category)
                  ->limit($limit)
                  ->all()
               );
       }
    }

***

There is also a `\Cake\Utility\CellTrait` for implementing cell() method on Controller and View.

CellTrait::cell() returns a Cell object, **cells are not rendered until they are echoed**.

    $news= $this->cell('LatestNews', ['limit' => 3]);
    echo $news; // triggers rendering cycle (Template/Cell/latests_news.ctp)

    $news = $this->cell('LatestNews', ['limit' => 5, 'category' => 'Music']);
    $news = (string)$cell; // this aswell

As Cells are not rendered at call time, this allows us to do nifty things (or abuse at will, lol) as follow:

    $cell = $this->cell('LatestNews', ['category' => 'Music']);
    $cell->applyViewMode('teaser');
    $cell->sendAnEmail();
    $cell->bakeSomeCookies();
    $cell->andDownloadSuspiciousFile();
    echo $cell;

Of course dot-notation is allowed for rendering plugin's cells:

    $tags = $this->cell('Taxonomy.TagCloud', ['amount' => 20]);
    echo $tags; // (Plugin/Taxonomy/Template/Cell/tag_cloud.ctp)

***

TODO:

- Cache
- View.before|afterCell ?
- ~~MissingCellException~~ [done]
- Write some test cases
- Write decent docblocks, my english sucks 
- Allows cells to use cells:
     Allow _Cell classes_ to use `cell()` method. Currently we can use `cell()` in Cell's templates as `cell()` is implemented in View class.


Best Regards!