Sure, here's the layout:
It's a 4-layer board, following all the recommendations in the data sheet. RN4870 is on top (red). Layer 2 (not shown) is a solid ground plane, layer 3 (not shown) is mixed plane/signal but nothing under the BLE module, layer 4 is bottom signal traces.
I accidentally deleted all the little ground stitching vias from my most recent iteration, and it still works pretty well, lol. They will return in the next version, though. The keepout areas must extend through all layers.
If you plan on using fixed-length timeouts between sending commands, be very careful. The module does not like to be sent a command before having acknowledged the previous one, and the acknowledgement time can vary tremendously. It's not enough to look at a couple of responses and say "Oh, it looks like 150ms will be enough", because at some point it will take 600ms for the same response. Much safer I think to take the trouble of actually listening for the responses "CMD> ", "AOK", "%REBOOT%", etc. Don't forget to include the delimiters also, e.g. "CMD>" has a trailing space, "AOK" is followed by <CR>,<LF>, and so forth. The individual characters can be separated by relatively long time intervals - if you stop looking when you get just "AOK", the <CR><LF> might come 50ms later. The module firmware does not seem very robust (i.e. it's WAY too easy to brick), so better to play safe. Also note that hardware flow control is recommended; I'm not sure if you can get away without that for short messages or not.