Implement Semian API

@Sirupsen, @fw42

This implements the API we discussed the other day: https://gist.github.com/Sirupsen/2c3e0fd18b1ee95de877

The hardest part was writing the tests, but I think I've covered all the case we care about. The tests are the part I care most about with regards to reviewing - the implementation was pretty straightforward.

Uh, nesting of those. Would we see that in places in the wild? E.g. calls that do other calls. We have to be careful with this when we implement the clients, so we don't end up acquiring more tickets than necessary.