Possibility to rename input keys, output keys and memory keys for all chains consistently
Labels: name: area: memory, name: auto:improvement, name: area: models

### Feature request

It should be possible to modify input keys, output keys and memory keys for all chains. Currently, this does not seem to be the case. For instance, while all these keys can be modified for the ConversationChain, not all of them can be modified for the ConversationalRetrievalChain.

**ConversationChain**

In the ConversationChain, I can freely rename the memory_key, input_key and output_key as the example below shows. This is as expected.

```
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts.prompt import PromptTemplate

# Keys can be freely adjusted
memory_key = "foo"
input_key = "bar"
output_key = "baz"

# Initialize the context with a prompt template
template = r"""The following is a friendly conversation between a human and an AI. 
The AI is talkative and provides lots of specific details from its context. If the 
AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:
{}
Human: {}
AI:""".format("{" + memory_key + "}", "{" + input_key + "}")

prompt = PromptTemplate(
    input_variables=[memory_key, input_key], template=template
)

# Initialize memory to store conversation history
memory = ConversationBufferMemory(
    memory_key=memory_key, input_key=input_key, output_key=output_key
)

# Initialize large language model
model_kwargs = {"engine": "gpt-35-turbo-0613", "headers": {"x-api-key": os.environ["OPENAI_API_KEY"]}}
llm = ChatOpenAI(model_kwargs=model_kwargs, temperature=0.0)

# Initialize and return conversation chain
chain = ConversationChain(
    llm=llm, memory=memory, prompt=prompt, verbose=True,
    input_key=input_key, output_key=output_key
)

# Example call
user_input = "What is GPT in 5 words?"
chain({input_key: user_input})[output_key]
```

**ConversationalRetrievalChain**

If I try to pass an `input_key` (or `input_keys`) argument to `ConversationalRetrievalChain.from_llm`, then I get the following error:

```
ValidationError: 1 validation error for ConversationalRetrievalChain input_key extra fields not permitted (type=value_error.extra)
```

It seems that with the current implementation, one has to use the input keys ["question", "chat_history"] (see [code here](https://github.com/langchain-ai/langchain/blob/777b33b873b50339659963f2b5aba17b69412f5a/libs/langchain/langchain/chains/conversational_retrieval/base.py#L86)).

However, the ConversationalRetrievalChain does, thankfully, accept the input argument `output_key`. I.e., the output_key can be modified but the input_keys cannot.


### Motivation

Provide consistency and ease of use across all chains. 

Currently, users may face difficulty in modifying input keys, output keys and memory keys for the ConversationalRetrievalChain which could result in inconsistency across the chains. By allowing modifications to these keys for all chains, users can have a consistent and standardized approach to building chatbots.

### Your contribution

TBD