Fixed `seal` bug, added `toJSON`, general cleanup

There was a bug in calling `seal` that caused it to error. Data types
now have `toJSON` methods by default that will recursively call `toJSON`
on it's values. You can now pass a value to `adt.single` to use when
calling `toJSON` so it isn't always null for single types.