Grapher: basic grapher

This are the first steps to build the `scrlib-php`, this PR contains:

* Grapher scaffolding
* Test suite
* DefExtractor
* DocExtractor:  a bit of work is required a `PHP-Parser`, too I need to clean the comments.
* RefExtractor: just the easy picks.

**Example:**
Input:
```php
<?php

namespace Foo;
use DateTime;

const QUX = 'test';

/**
 * Command that places bundle web assets into a given directory.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Bar extends Foo implements Baz
{
    const BAZ = 'baz';
    use Qux;

    /* Escapes "<" special char in given text. */
    public $publicProperty;
    private $privateProperty;
    protected $protectedProperty;

    public function __construct(Foo $foo) {
        $this->foo = $foo;
    }

    /**
     * Escapes "<" special char in given text.
     *
     * @param string $text Text to escape
     *
     * @return string Escaped text
     */
    public function publicMethod() {}
    protected function protectedMethod() {}
    private function privateMethod() {}
}

class Foo {}

/**
 * Setup the layout used by the controller.
 */
trait Qux {
    public function Bar() {}
}

interface Baz
{
    public function publicMethod();
}

function baz(DateTime $bar, $qux = QUX) {
    $foo = Bar::BAZ;
}


$bar = new Bar(new Foo());

```

Output:
```json
{
    "Defs": [
        {
            "Kind": "constant",
            "Name": "QUX",
            "TreePath": "Foo/QUX",
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 37,
            "DefEnd": 56,
            "Exported": true
        },
        {
            "Kind": "class",
            "Name": "Bar",
            "TreePath": "Foo/Bar",
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 183,
            "DefEnd": 757,
            "Exported": true
        },
        {
            "Kind": "property",
            "Name": "publicProperty",
            "TreePath": "Foo/Bar/publicProperty",
            "Exported": true,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 313,
            "DefEnd": 336
        },
        {
            "Kind": "property",
            "Name": "privateProperty",
            "TreePath": "Foo/Bar/privateProperty",
            "Exported": false,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 341,
            "DefEnd": 366
        },
        {
            "Kind": "property",
            "Name": "protectedProperty",
            "TreePath": "Foo/Bar/protectedProperty",
            "Exported": false,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 371,
            "DefEnd": 400
        },
        {
            "Kind": "method",
            "Name": "__construct",
            "TreePath": "Foo/Bar/__construct",
            "Exported": true,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 406,
            "DefEnd": 478
        },
        {
            "Kind": "method",
            "Name": "publicMethod",
            "TreePath": "Foo/Bar/publicMethod",
            "Exported": true,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 638,
            "DefEnd": 671
        },
        {
            "Kind": "method",
            "Name": "protectedMethod",
            "TreePath": "Foo/Bar/protectedMethod",
            "Exported": false,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 676,
            "DefEnd": 715
        },
        {
            "Kind": "method",
            "Name": "privateMethod",
            "TreePath": "Foo/Bar/privateMethod",
            "Exported": false,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 720,
            "DefEnd": 755
        },
        {
            "Kind": "class",
            "Name": "Foo",
            "TreePath": "Foo/Foo",
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 759,
            "DefEnd": 771,
            "Exported": true
        },
        {
            "Kind": "trait",
            "Name": "Qux",
            "TreePath": "Foo/Qux",
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 825,
            "DefEnd": 867,
            "Exported": true
        },
        {
            "Kind": "method",
            "Name": "Bar",
            "TreePath": "Foo/Qux/Bar",
            "Exported": true,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 841,
            "DefEnd": 865
        },
        {
            "Kind": "interface",
            "Name": "Baz",
            "TreePath": "Foo/Baz",
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 869,
            "DefEnd": 922,
            "Exported": true
        },
        {
            "Kind": "method",
            "Name": "publicMethod",
            "TreePath": "Foo/Baz/publicMethod",
            "Exported": true,
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 889,
            "DefEnd": 920
        },
        {
            "Kind": "function",
            "Name": "baz",
            "TreePath": "Foo/baz",
            "File": "/tests/fixtures/500.complex.php",
            "Test": false,
            "DefStart": 924,
            "DefEnd": 988,
            "Exported": true
        }
    ],
    "Docs": [
        {
            "TreePath": "Foo/Bar",
            "Format": "text/plain",
            "Data": "/**\n * Command that places bundle web assets into a given directory.\n *\n * @author Fabien Potencier <fabien@symfony.com>\n */",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 0,
            "End": 0
        },
        {
            "TreePath": "Foo/Bar/publicProperty",
            "Format": "text/plain",
            "Data": "/* Escapes \"<\" special char in given text. */",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 0,
            "End": 0
        },
        {
            "TreePath": "Foo/Bar/publicMethod",
            "Format": "text/plain",
            "Data": "/**\n * Escapes \"<\" special char in given text.\n *\n * @param string $text Text to escape\n *\n * @return string Escaped text\n */",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 0,
            "End": 0
        },
        {
            "TreePath": "Foo/Qux",
            "Format": "text/plain",
            "Data": "/**\n * Setup the layout used by the controller.\n */",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 0,
            "End": 0
        }
    ],
    "Refs": [
        {
            "DefPath": "DateTime",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 22,
            "End": 35
        },
        {
            "DefPath": "Foo/Baz",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 216,
            "End": 219
        },
        {
            "DefPath": "Foo/Foo",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 201,
            "End": 204
        },
        {
            "DefPath": "Foo/Qux",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 253,
            "End": 256
        },
        {
            "DefPath": "Foo/Foo",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 434,
            "End": 442
        },
        {
            "DefPath": "DateTime",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 937,
            "End": 950
        },
        {
            "DefPath": "QUX",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 952,
            "End": 962
        },
        {
            "DefPath": "QUX",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 959,
            "End": 962
        },
        {
            "DefPath": "Foo/Bar/BAZ",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 970,
            "End": 985
        },
        {
            "DefPath": "Foo/Bar/BAZ",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 977,
            "End": 985
        },
        {
            "DefPath": "Foo/Bar",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 991,
            "End": 1016
        },
        {
            "DefPath": "Foo/Bar",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 998,
            "End": 1016
        },
        {
            "DefPath": "Foo/Foo",
            "File": "/tests/fixtures/500.complex.php",
            "Start": 1006,
            "End": 1015
        }
    ]
}
```