New data structure

@andreit +1 to the `GoError` idea. Wherever we handle these errors, its likely we will want to catch any unhandled errors (`Error` instances included), since many of the things that might break will be things we did not anticipate. Still a good idea to throw our own error type for places where we did anticipate this though.

Maybe our components need a `.validate` method that encapsulates these kinds of things, and have the constructor call out to it?