WIP: proposed design+implementation of serializing objects with cycles

this design is fully backwards-compatible with all uses and definitions of `serialize` and `deserialize`.

the methodology is as follows:

* serialize to an `IOBuffer`, and do a takebuf when a message is done

* objects that can participate in cycles insert

    ```
    serialize_cycle(io, OBJ) && return
    ```

  at the top of their `serialize` methods

* to support deserialization, implement `deserialize(io, ::Type{T}, pos)` and insert

    ```
    deserialize_cycle(pos, OBJ)
    ```

  as soon as the new object `OBJ` is allocated.

Part of the motivation for this design is that many types will never participate in cycles, and so as a user or extender of the serialization API it is possible to ignore the issue entirely,