SList: correct reference semantics

With this changes `SList` will behave as `DList`:
```d
unittest
{
    import std.algorithm : equal;

    auto a = SList!int(5);
    auto b = a;
    auto r = a[];
    a.insertFront(1);
    b.insertFront(2);
    assert(equal(a[], [2, 1, 5]));
    assert(equal(b[], [2, 1, 5]));
    r.front = 9;
    assert(equal(a[], [2, 1, 9]));
    assert(equal(b[], [2, 1, 9]));
}
```

PR probably incomplete, I have to check documentation and maybe deprecate some methods. (Opened it now to have more motivation.)

@monarchdodra's thread: http://forum.dlang.org/thread/gjhclwsuqyhrimdeoaec@forum.dlang.org
A cleaner way is to declare root as NodeWithoutPayload and be done about it.