Rewrite with clear separation of concerns (closes #2)

I just started working on some documentation for how I envision the pieces of this library to fit together. Most of this is obviously just sketches and fairy tales at the moment, but at least it might give us something to discuss and improve on. I'm hoping that discussions around these documents can help finalize some decisions that are probably easier to make before writing macro-heavy code than after =)
I thought about this too, but only toward the end of my productivity run the other day, and then I didn't want to break everything :P

But yeah, a type parameter with the contraints enforced in the constructor is probably a good way to go. (I'm personally hoping that Julia will one day support interdependent type arguments such as `foo{T,N,AT<:AbstractArray{T,N}}` (which then also puts an implicit constraint on `N`...), but constructor logic is probably good enough until then.