First pass at "model sets" implementation.  This gets all the existing
tests working.  Some tests had to be updated to *explicitly* set
model_set_axis=0.  This is because they used model types that previously
set their param_dim implicitly from the shape of the first
parameter--the type of ambiguous implicit action we're trying to get
away from.

As a result I believe there were some tests that intended to test single
models (i.e. param_dim=1) with array-valued parameters, but didn't
actually do this.

As such, array-valued parameters are not yet working quite properly, but
that will come in the next changeset.

Another annoyance with this so far is that in order to use
model_set_axis to specify the set size it is *necessary* to provide a
value for at least one parameter.  This seems arbitrary and awkward for
models that have default values for all their parameters.  It should be
possible to initialize those without providing any parameter values.

For that reason it might be worth introducing an n_models argument with
the same semantics and param_dim (some people in previous discussions
were okay with the name 'n_models').  I'd also consider model_set_size.
model_set_size could work in tandem with model_set_axis and one, the
other, or both could be specified (if both they would obviously have to
agree).
Fix the param_sets property to work somewhat consistently within the new system.  I'm not sure how much longer I want to keep this property around in its present form at all, but for now I tried to manimize the changes necessary to any other code or tests.  One thing that is slightly different now is that *previously* the last axis of the param_sets array was always the same size as the number of param sets (that is, the last axis was the param set axis).  Now that is no longer guaranteed--instead it corresponds to whatever axis was specified by model_set_axis.  We could roll that axis to the end, but for now I prefer preserving the contiguity of each parameter array).
Re-introduced an n_models argument analogous to the old param_dim argument (with backwards compatibility support for param_dim).  This was necessary in cases where no initial values are provided for any parameters (all parameters have default values), and is also simply clearer in other cases.  The model_set_axis argument is still needed in addition to this to meet all use cases.  However, when n_models > 1, model_set_axis defaults to zero unless otherwise specified.  Setting model_set_axis=False disables it entirely.
WIP: A lot of work to make sure that array-valued parameters (with or without multiple parameter sets) can broadcast with each other in a logical way).
This should just raise an AttributeError, since __getattr__ is not defined on the base class.
Just a bit of trivial formatting fixup in this module--several of these tests are failing, for now
What is logic?  Actually, no, I don't know where I got the idea that if all arrays broadcast with one array then they all mutually broadcast.  We actually have to check all shapes against each other to ensure broadcastability.  Fortunately this can be done fairly easily on the order of the number of params * the max param dimension.  In fixing this I think I significantly simplified the logic in _check_param_broadcast so that it's a good deal more coherent.
A more useful implementation of check_broadcast--instead it now raises an exception if any of the shapes are incompatible (which is fine since this is always an error situation anyways) and if the check succeeds it will return the full shape of all the arrays broadcast with each other.
Some major progress on getting all the possible input/parameter combinations working properly.  There are still more cases that need to be tested, and the code is unfortunately very complicated and confusing.  I think it can probably be made simpler by breaking it into a few different subroutines for different cases, rather than handling all possible cases in the same loop.
Go ahead and make a special case for scalar inputs--they are allowed even when n_models > 1 since the intent is fairly unambiguous and they are always broadcastable.
Fix a few other tests that weren't working correctly.  The explanatory prose in the docs still needs to be updated, but all the doc tests are working now.
Broke format_input into separate subroutines for singles modules versus model sets.  This results in a *little* bit of code duplication that might be avoidable with a little more thought.  But for now this made it a little easier to follow and debug.  Added a workaround for models that don't follow the broadcasting assumptions made by format_input; so far the one case we have for that is the AffineTransformation model.
Added a couple more tests cases and the fix required for them to work
Fix typo in exception message
Add new documentation for how model inputs and parameters work.  Most of this should probably be moved from the module docstring to the Sphinx docs, as it is usage documentation.  It would make more sense for the module docstring itself to provide some overview of what's in the module, and not necessarily how it works at a high level.
Fix for Python 3 (izip_longest -> zip_longest) and skip the doctests in modeling.core for now since they give slightly, unsubstantially different outputs on Python 3, and are likely to be moved to the Sphinx docs anyway.
Don't override the backwards compat for the param_dims argument, as pointed out by @mhvk
Address two more comments from @mhvk: Fixes a faulty logical expression in the if statement.  Changes usages of numpy.asarray to numpy.asanyarray in anticipation of Quantity support.
WIP: Updating the modeling documentation to better reflect to the current implementation details, as well as to downplay details that might change in the near future, and improve examples a bit.
Further progress updating the docs, including fixing several errors, and a new section early in the docs explaining what the deal is with model sets.  An example of fitting multiple models simultaneously would be nice, but I'm having trouble getting that to work right now...