Implement Player

Note that the first commit in this series is somewhat controversial, so might warrant some discussion with Brian before landing.