Modeling liquid handlers

ohh I like that!

@property
def pip(self):
  if len(self.heads) == 1:
    return self.heads[0].pip
  raise ValueError

self.heads might be a horrible name, but just s//g that. same for pip.

but the general idea of providing convenience methods that work in 99% of cases while keeping the underlying structure is neat

staying accurate here: we ~decided in the other thread that the objects/front ends would be called capabilities. The methods are just methods. Changing that is still possible of course but is a separate conversation.