Session writing, a working draft. Interested in feedback before push.
I'm not ready to pull request it, because what I did here was a total blindshot.

The implementation, actually, was pretty simple (and that's my main concern), posting this issue for review-discussion.

I have tested only with Symfony's `PdoSessionHandler`.

---
### `Ratchet\Session\SessionProvider`:

> The changes are minimal, only for onClose - added the `Session::save` call.

``` php
function onClose(ConnectionInterface $conn) {
    // "close" session for Connection

    $conn->Session->save();

    return $this->_app->onClose($conn);
}
```
### `Ratchet\Session\Storage\VirtualSessionStorage`:

> This is where the most additions come in, yes, to the newly invoked `save` method.
> 1. As Chris had suggested in method comments, I took data from classic Bags, Metadata Bag and appended it to a temporary array for serialization.
> 2. I pass it forward to `Serializer::serialize` for serialization.
> 3. Serialized data is passed to `saveHandler`, which in my setup is `Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler`.

``` php
public function save() {
    // get the data from the bags?
    // serialize the data
    // save the data using the saveHandler
//        $this->saveHandler->write($this->saveHandler->getId(), 

    $toSerialize = array();

    // Push calssic bags for serialization.
    foreach ($this->bags as $bag)
    {
        $toSerialize[$bag->getStorageKey()] = $bag->all();
    }

    // Get metadata bag.
    $meta = $this->metadataBag;

    // Stamp it.
    $meta->stampNew();

    // Push for serialization.
    $toSerialize[$meta->getStorageKey()] = array(
        MetadataBag::UPDATED => $meta->getLastUsed(),
        MetadataBag::CREATED => $meta->getCreated(),
        MetadataBag::LIFETIME => $meta->getLifetime()
    );

    // Serialize the data.
    $serialized = $this->_serializer->serialize($toSerialize);

    // Commit to storage.
    $written = $this->saveHandler->write($this->saveHandler->getId(), $serialized);

    if (!$this->saveHandler->isWrapper() && !$this->getSaveHandler()->isSessionHandlerInterface()) {
        $this->saveHandler->setActive(false);
    }

    $this->closed = true;
}
```
### `Ratchet\Session\Serialize\PhpHandler`:

> Last, but not least, the **RuntimeException** "Serialize PhpHandler:serialize code not written yet, write me!" has got an implementation.

``` php
function serialize(array $data) {
    $returnData = '';

    foreach ($data as $key => $values)
    {
        $returnData .= $key . '|' . serialize($values);
    }

    return $returnData;
}
```

---

My concerns are about **saving** and **serialization**.

**Saving**:
I'm unsure if a simple save `onClose` will properly close the session. Previosuly there was no specific close handling, may be it's automated, didn't dig deeper to find out every detail.

**Serialization**:
I based the serializators output on the `rawData` input. My goal was to exactly match the input data. For that purpose it works, but I'm not sure it it will match everything.

---

Looking forward to feedback.
