The distribtion interface was too complicated for what it provided. To achieve its
intended functionality, larger changes needed to occure such as including the base ring
in the Distribution interface and probably moving the samplers to the rlwe package.
Since this is not the envision goal of this PR, I simplified the distribution
parameterization so that it meets these goals.
The use of OperandQP for public key is correct but a bit of an overkill, especially since public-keys
must be of size two (which requires an additional check at cast/read/write anyway) and because they
should not require to serialize ciphertext-related metadata.
The WriterTo and ReaderFrom standard interface should be sufficient for the serialization
of lattigo objects from their pointers. Other interfaces such as BinaryMarshaller should
be based on WriterTo. This is possible in an efficient way if the Writer and Reader interface
expose their internal buffer.
Vector and Matrix now use []T and [][]T as underlying types, which makes them more versatile and easy to cast to from slices.
Map still uses map[K]V as map values cannot be addressed and this is anoying to use.
I also got rid of the Codec[T] type as it can be replaced with a 3-liner (i.e., equivalent to calling the Codex and checking the error).
There is also a small change of the OperendQ.Encode method that now uses OperandQ.WriteTo instead of OperandQ.Encode (since it is a bit fasterfor some reason...). This is an experiment and more work on the serialization is needed.