WIP: Use descriptors for easier probing, introspection, etc

This is the first step in a more robust and scalable solution to several issues that keep cropping up, including, but not limited to:

- probing
- setting default parameters for all Ensembles, LIFs, etc
- input validation (reasonable values for parameters)
- improved automatic documentation and discovery of object attributes / things that are probable

In general, these changes give us more control over the attributes on our objects. Notably, however, this additional control has not come at the expense of readable scripts, as I didn't have to make any changes to the unit tests or examples despite changing everything in objects.py.

Some of this is inspired by [Param](http://ioam.github.io/param/), but I've stripped it down to the bare essentials that we would need, and ensured