Add support for images & image repositories

The first commit will likely go away assuming @csrwng's builds PR lands first. (#43)

This adds support for images and image repositories to origin. It also adds a webhook for the Docker registry that can be invoked whenever a new tag is pushed to a Docker image repository. The webhook receives data from the registry (repository, image id, image metadata, tag) and stores the data in origin. The corresponding Docker registry changes are here: https://github.com/ncdc/docker-registry/compare/openshift_hook

**TODO**
- [ ] godoc comments
- [ ] tests
- [x] etcd registry implementation
- [ ] validation methods
- [ ] kubecfg support


----- Original Message -----
> > +func (s *RepositoryRegistryStorage) List(selector labels.Selector)
> > (interface{}, error) {
> > +	imageRepositories, err := s.registry.ListImageRepositories(selector)
> > +	if err != nil {
> > +		return nil, err
> > +	}
> > +	return imageRepositories, err
> > +}
> > +
> > +func (s *RepositoryRegistryStorage) Delete(id string) (<-chan interface{},
> > error) {
> > +	return apiserver.MakeAsync(func() (interface{}, error) {
> > +		return baseapi.Status{Status: baseapi.StatusSuccess},
> > s.registry.DeleteImageRepository(id)
> > +	}), nil
> > +}
> > +
> > +func (s *RepositoryRegistryStorage) Create(obj interface{}) (<-chan
> > interface{}, error) {
> > +	imageRepository := obj.(*imageapi.ImageRepository)
> 
> I still think it's better to double check the type, then having random
> runtime panics when someone inits the storage with some wrong repository
> type.
> 

In both cases the user is going to see an error when they try to run the operation.  However, handlers recover and log panics, so it'll show up as a stack trace in the logs, which is better than only showing up to end users as JSON.