Add rate limiter, to cut-off custom clients if traffic goes above configured level.

Java's ConcurrentLinkedDeque (and Queue) does not provide constant time and strongly consistent size() and each call will cause a traversal of the deque.

Since we are locking anyway, and the normal operation of the RateLimiter will involve the locked portion of the code, we can extend the lock to include the if. We can then switch to using a straight LinkedList.