bidirectional RNNs
Follow-up on #228 

For bidirectional RNNs there are "implementation details" to be aware of.

1. Allowing different merge modes of the forward and backward time layers at no allocation cost
and with as few overhead as possible:

  - similar to Keras do we use a [bidirectional wrapper](https://keras.io/layers/wrappers/#bidirectional) that would return a tuple of forward/backward tensors
  - or similar to PyTorch, we concatenate result by default while making sure that the bidirectional time dimension is outer to the resulting features (i.e. shape `(seq_len, batch, num_directions * hidden_size)` can be reshaped into `(seq_len, batch, num_directions, hidden_size)` with data staying contiguous)

2. Type of bidirectional LSTM, see https://github.com/pytorch/pytorch/issues/4930#issuecomment-361851298.
  ![](https://user-images.githubusercontent.com/14052287/35610748-dd41a23a-06a5-11e8-803e-c577359c372b.jpg).
  CuDNN LSTMs in PyTorch are type 1 while CPU LSTMs in PyTorch are type 2

