factored Cons/Snoc out into classes