UI changes

Makes several UI changes requested by AnthroCon.
Three things:

1) As a minor stylistic matter, it would be shorted to say ``.filter_by(fk_id=instance.id, action=action)``.  That would be equivalent to what you have.

2) As a naming matter, the name ``get_tracking_by_attendee`` implies that this function is only valid for ``Attendee`` instances, but really this would work for any model.  So you should probably either restricted this to only attendees (by specifying ``model='Attendee'`` in the filter, or rename this to be more generic.

Because this applies equally well to everything, I'd probably just put all three of these new functions (this one plus the two properties which use it) in the ``MagModel`` class, but that's really just future-proofing against other future uses of this and definitely doesn't nee to be done now.

3) Most seriously, I think there are a couple of bugs here. this function could definitely use some unit tests, but I certainly write a lot of untested functions myself due to time constraints, so as a person whose house is made of glass I am in no position to throw stones :P

When ``last_only`` is truthy, here are the current semantics of this function:
- if there are no results, return ``None``
- if there is exactly one result, return that result
- if there's more than one result, raise an exception

I don't think that's what you intended.  As it happens, Django templates swallow this type of exception and just return a falsey value, so I think this happens to not affect you at the moment, but it would if you tried using this function in a different context.

Here's an alternate implementation which probably does what you want:

```python
def get_tracking(self, instance, action, last_only=True):
    query = self.query(Tracking).filter_by(fk_id=instance.id, action=action).order_by(Tracking.when.desc())
    return query.first() if last_only else query.all()
```

So the semantics now are as follows:
- ``last_only=True`` will return ``None`` if nothing exists and return the first item if something exists
- ``last_only=False`` will always return a list, which will be empty if nothing exists

That's probably what you'd want in this situation.

Although be aware that saying ``self.session.get_tracking(...)`` will raise an exception if you call it on something which isn't already part of a session.  Since this deals with the ``Tracking`` table, this seems reasonable, and I see that you're wrapping this stuff in an ``is_new`` check which is sensible.  I just wanted to point this out for future reference.