Implemented the allocator of a container as a private base class instead of a member.

I did this because if you implement the allocator as a member, it is required by the standard to take up space even though it might not have any non-static members like the default allocator. In practice this means that containers will be 8 bytes larger than required (on x64). with the allocator as a base class, the compiler can use empty base class optimization and the size of the allocator can be 0.