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/Cell` namespace.
- Must extend the abstract class `\Cake\View\Cell`
- ~~And implement the `render()` method.~~
- Cell's template must be located in `Template/Cell/<CellName>` 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)~~
- Default template name is the underscored version of the cell action name invoked. e.g.: `Template/Cell/TagCloud/simple_list.ctp` for `$this->cell('TagCloud::simpleList')`
- Cell classes are able to use Helpers and Tables. (Cell::loadModel() & Cell::$helpers)

Example:

    // App/View/Cell/LatestNewsCell.php
    namespace App\View\Cell;

    class LatestNews extends \Cake\View\Cell {

       // Template/Cell/LatestNews/teaser.ctp
       public function teaser($limit = 5, $category = null) {
          $conditions = $category === null  ? [] : ['category' => $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::teaser', ['limit' => 3]);
    echo $news; // triggers rendering cycle (Template/Cell/LatestNews/teaser.ctp)

    $news = $this->cell('LatestNews::teaser', ['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::teaser', ['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::teaser', ['amount' => 20]);
    echo $tags; // (Plugin/Taxonomy/Template/Cell/TagCloud/teaser.ctp)

***

TODO:

- ~~Cache~~ [no for the moment]
- ~~View.before|afterCell ?~~ [no for the moment]
- ~~MissingCellException~~ [done]
- ~~Write some test cases~~ [done]
- ~~Write decent docblocks, my english sucks~~ [done]
- ~~Allow cell methods to accept multiple arguments.~~ [done]

Best Regards!