Add lots of missing impls, many small design tweaks