POC - Feature: Repository abstraction for in-memory datastores.

**-- CAUTION --** This is a POC exploring potential of having support for in memory stores.

Basically we provide abstractions for `InMemoryOperations`. The abstraction allows putting any in memory implementation like plain `Map` underneath.  Support for EhCache has been done to have a second implementation to see if it works for more than one type.

So what this currently allows to derive queries for Map implementation using `SpEL` as well as `Criteria` based ones for EhCache. Both implementations are not finished and only support a subset of what's possible.

Using `@EnableInMemoryRepositories` can be used for repository creation. Defining `repositoryFactory` allows to use other than default `MapBackedRepositoryFactory` so one can easily switch eg. to `EhCacheBackedRepositoryFactory`.

Have a look at `GenericInMemoryRepositoryUnitTests` as a base and the concrete ones `MapRepositoryUnitTests` and `EhCacheRepositoryUnitTests` to get an impression.

How about:
```java
	public <T> T getId() {

		if (!entity.hasIdProperty()) {
			throw new InvalidDataAccessApiUsageException(String.format("Cannot determine id for type %s", entity.getType()));
		}

		PersistentProperty<?> idProperty = entity.getIdProperty();
		Object id = wrapper.getProperty(idProperty);

		if (id != null) {
			return (T)id;
		}
			
		id = idGenerator.newIdForType(idProperty.getActualType());
		wrapper.setProperty(idProperty, id);
		
		return (T) id;
	}
```