LIFO queue implementation.
@type item() :: any()
@type max_size() :: pos_integer() | nil
@type size() :: non_neg_integer()
@type t() :: %Qu.LIFO{max_size: max_size(), size: size(), stack: [item()]}
@spec new(max_size()) :: t()
@spec peek(t()) :: {:ok, item()} | :error
@spec pop(t()) :: {:ok, item(), t()} | :error
@spec put(t(), item()) :: {:ok, t()} | :error
@spec size(t()) :: size()