This is a version of the queue we have elsewhere, but we can get rid of all the casting and interface usage in favor of a type param.