Some random thoughts. If your only representation for data is a byte string, then things work out ok, unless you want first class functions, coz now your function definitions have to be expressed in assembly packed into memory and I guess that would have to be your source code.
Even jsut sticking to classic data like JSON and pointers, the byte representation flattens what is intuitively logically hierarchical.
the cycle problem you mention is the mismatch between flat memory and a heirarchical logical representation that permits cycles. There is no 1-1 mapping between a DAG and a flat representation, but there are 1-n where the ambiguity is where you break the pointers.
At work we use pickle and later upgraded to
dill for serializing runtime graphs. For python it seems like a super hard problem given dynamic function definitions and the interpretability but I guess you have closed off some of that if its a compiled language.