make Agent a marker interface and let attribute getters be defined by implementations
this is called so often that it really makes a huge difference to store
attributes in a map or directly. All classes using Agent are made
generic, so that the required implementation can be used without casts.