gunning for a crypto implementation where we use polymorphism to hang things as interfaces off structs rather than using enums with giant switch statements.  also removing asn1 from the serial form in favor of something much more simple -- that overcomplicated spec has caused more than enough critical vulns in other products.
attempt to strap the new encrypter to benchmarking.... this fails bizarrely: go test panics with 'flag redefined: t'; my best guess being because something perverse about renamed package imports is tricking it into running those var initializers twice.  this is not the first time having feature code in the main package has resulted in completely nutzo behavior; we need to doubletime on moving all remaining feature code out of the main package.
Merge-ignore branch 'feature/crypto-polymorphism-bench' into feature/crypto-polymorphism.
start fiddling away at extracting the troublesome references from the schema package back to the main package.  borken commit, there's way too much to do here
giant mess of work carrying over the function pointer abstractions already used for block cipher and mac system to the stream cipher construction.  still borken, pending resolve of questions about how to make the least bad interfaces.
schema compiles again.
describe what doing better
i hate english sometimes
finish serializing length headers correctly and doing the decryption implementation.  no tests yet, so assume everything is wrong, but it compiles.
update the amount of stuff exported by the Schema interface and start porting over tests currently in the main package.
fix mixup of block size
tests do not share state.
make output length estimation not wrong.  crypto tests now pass roundtrip for this setup.
make newKey general within the schema package.
fmt
port benchmarks.

on the 4M case, this setup seems to do roughly 4% faster both ways (meh) and score about 3x better on bytes/op on decryption and 2x on encryption (not surprising, since one round of buffering went away since we can stream outputs with this format instead of sitting on them until we have the MAC to pass into ASN1 and *then* start outputting body).

more like 20% faster for the 1k case.  presumably mostly again because the overhead of ASN1 and that extra buffer disappeared.

overall, performance wasn't so much the reason for these format changes, but not bad improvements nonetheless.  the cipher still can't operate fully streamwise on very large (i.e., multi-gigabyte) files, but the format also no longer poses major hurdles to that in the future; we just have to fix the encryptor to be willing to do two passes on the input.
Merge first draft of branch 'feature/crypto-polymorphism' into moar-cli.  it's not yet fully connected and does not include the total set of previous algorithms, but it's roughly operable and we should be able to update the rest to this.
port the rest of the crypto functions to polymorphic style.  `goad test schema` gives utterly unbelievable error messages right now, given that this is just a straight port of hank's existing functionality -- apparently using func args hits a stricter type check for whether pointer or direct struct than actually just invoking the damn thing.  not sure what going to do.
THIS FIX.  this.  fix.
keys are an interface.  or close enough in this case.