Implement ``custom_model_2d``

Since we have ``custom_model_1d``, is there any reason we can't have ``custom_model_2d``?
Yes, that's worth clarifying.  I think I might also go ahead and make it so that the decorator can take arguments too (for example `@custom_model(fit_deriv=...)`