First problem, maybe due to embedding, the library does not correctly see that
`BaseVariant` implements the `struc.Custom` (https://github.com/lunixbochs/struc/blob/master/struc.go#L54).
Even when implementing directly on the type (`system.Instruction`), the library does not
see it anyway.
But even if that would work, I don't think it will possible to make it work. The library
pre-allocate an array using the `Size` instruction. In your case, without serializing,
we don't know in advance without actually packing what will be the final packing size.
I'm my opinion that we should go back to our custom encoding/decoding code that we had
in eos-go, probably even extracting it (the base work) and re-use it.
I think `struc` won't be able to do that dynamically, we'll need a small
decoder, mostly for Transcations.. and perhaps if other people use that
in their contracts.