Adds a queue container

Adds a queue/FIFO container, considering the feedback given in #2361.
Templated types that take arbitrary type arguments, such as containers, generally shouldn't have explicit attributes, unless there's an explicit design requirement to guarantee a particular attribute. The problem is that we don't know, and can't know, beforehand whether `T`'s methods are `@safe` or not. So if a user-defined type has un-`@safe` constructors, for example, attempting to use `Queue` with it will cause a compile error.
The correct approach is to leave off attributes from templated types (including its methods -- I notice you attributed methods as `pure`), and let the compiler automatically infer the maximal attribute set. Now, of course, we also want to make sure any un-`@safe`-ness or impurity is caused by `T` itself, not by the code in `Queue`; this can be achieved by having `@safe pure` unittests that instantiate `Queue` with a built-in type that's known to be `@safe` and `pure`. Then any mistakes on our part (or on the part of anyone who changes this code in the future) will be caught by the unittest failing to compile, yet at the same time `Queue` will be usable with user types that are impure, non-`@safe`, etc..