Advice for implementing GADTs?