This includes both the implementation and interface versions.

My initial iterator design will support both forward and backwards iteration and peeking operations.
This is a little heavy handed compared to Java's iterator, but I see no reason to not have these operations aside from added complexity (which is what this project is all about).

After quite a bit of deliberation, I ultimately decided to have the iterators live in the same files as the collection they are iterating on.
Having them live in separate files makes little sense to me since each collection has its own optimized iterator implementation.
You cannot really mix and match iterators at an implementation level.

Added a simple Boolean enum to make up for the surprising fact that C doesn't have a built in boolean type.

Rejiggering most of the structs to have separate typedefs and definitions.
This was necessary for the iterator work and just looks better in the long run.